如何使用 Gson 解析 JSON 数组
Posted
技术标签:
【中文标题】如何使用 Gson 解析 JSON 数组【英文标题】:How to Parse JSON Array with Gson 【发布时间】:2012-01-12 08:45:05 【问题描述】:我想解析 JSON 数组并使用 gson。首先,我可以记录 JSON 输出,服务器清楚地响应客户端。
这是我的 JSON 输出:
[
id : '1',
title: 'sample title',
....
,
id : '2',
title: 'sample title',
....
,
...
]
我尝试了这种结构进行解析。一个类,它依赖于所有 JSONArray 的单个 array
和 ArrayList
。
public class PostEntity
private ArrayList<Post> postList = new ArrayList<Post>();
public List<Post> getPostList()
return postList;
public void setPostList(List<Post> postList)
this.postList = (ArrayList<Post>)postList;
岗位类:
public class Post
private String id;
private String title;
/* getters & setters */
当我尝试使用 gson 时没有错误、没有警告和没有日志:
GsonBuilder gsonb = new GsonBuilder();
Gson gson = gsonb.create();
PostEntity postEnt;
JSONObject jsonObj = new JSONObject(jsonOutput);
postEnt = gson.fromJson(jsonObj.toString(), PostEntity.class);
Log.d("postLog", postEnt.getPostList().get(0).getId());
怎么了,怎么解决?
【问题讨论】:
【参考方案1】:你可以直接解析JSONArray
,不需要再用PostEntity
包装你的Post
类,也不需要新的JSONObject().toString()
:
Gson gson = new Gson();
String jsonOutput = "Your JSON String";
Type listType = new TypeToken<List<Post>>().getType();
List<Post> posts = gson.fromJson(jsonOutput, listType);
希望对您有所帮助。
【讨论】:
我删除了 PostEntity 类并尝试了你的 sn-p。还是没变。谢谢。 终于正确有效地工作了。再次感谢您。 嗨,如何解析这样的嵌套 json 数组数据 .... [ "firstName": "Bidhan", "lastName": "Chatterjee" , [ "type": "personal" ,“号码”:“09832209761”,“类型”:“传真”,“号码”:“91-342-2567692”]] 使用 TypeToken 有什么好处吗?根据我的测试,gson 似乎在不使用 TypeToken 的情况下处理 List 有什么方法可以使用泛型类而不是“发布”。我如何解析泛型类。【参考方案2】:我一直在寻找一种以更通用的方式解析对象数组的方法;这是我的贡献:
CollectionDeserializer.java
:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
public class CollectionDeserializer implements JsonDeserializer<Collection<?>>
@Override
public Collection<?> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException
Type realType = ((ParameterizedType)typeOfT).getActualTypeArguments()[0];
return parseAsArrayList(json, realType);
/**
* @param serializedData
* @param type
* @return
*/
@SuppressWarnings("unchecked")
public <T> ArrayList<T> parseAsArrayList(JsonElement json, T type)
ArrayList<T> newArray = new ArrayList<T>();
Gson gson = new Gson();
JsonArray array= json.getAsJsonArray();
Iterator<JsonElement> iterator = array.iterator();
while(iterator.hasNext())
JsonElement json2 = (JsonElement)iterator.next();
T object = (T) gson.fromJson(json2, (Class<?>)type);
newArray.add(object);
return newArray;
JSONParsingTest.java
:
public class JSONParsingTest
List<World> worlds;
@Test
public void grantThatDeserializerWorksAndParseObjectArrays()
String worldAsString = "\"worlds\": [" +
"\"name\":\"name1\",\"id\":1," +
"\"name\":\"name2\",\"id\":2," +
"\"name\":\"name3\",\"id\":3" +
"]";
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Collection.class, new CollectionDeserializer());
Gson gson = builder.create();
Object decoded = gson.fromJson((String)worldAsString, JSONParsingTest.class);
assertNotNull(decoded);
assertTrue(JSONParsingTest.class.isInstance(decoded));
JSONParsingTest decodedObject = (JSONParsingTest)decoded;
assertEquals(3, decodedObject.worlds.size());
assertEquals((Long)2L, decodedObject.worlds.get(1).getId());
World.java
:
public class World
private String name;
private Long id;
public void setName(String name)
this.name = name;
public String getName()
return name;
public Long getId()
return id;
public void setId(Long id)
this.id = id;
【讨论】:
@Miere 我不明白这是如何从 JsonArray 转换为 List在对象数组中转换
Gson gson=new Gson();
ElementType [] refVar=gson.fromJson(jsonString,ElementType[].class);
转换为帖子类型
Gson gson=new Gson();
Post [] refVar=gson.fromJson(jsonString,Post[].class);
将其读取为可以使用 TypeToken 的对象列表
List<Post> posts=(List<Post>)gson.fromJson(jsonString,
new TypeToken<List<Post>>().getType());
【讨论】:
作为 ArrayListType listType = new TypeToken<List<Post>>() .getType();
List<Post> posts = new Gson().fromJson(jsonOutput.toString(), listType);
【讨论】:
虽然这可以回答问题,但它没有提供任何上下文来解释如何或为什么。考虑添加一两句话来解释你的答案。【参考方案5】:这篇文章的一些答案是有效的,但是使用 TypeToken,Gson 库会为您的应用程序生成一个带有虚幻类型的 Tree 对象。
为了得到它,我必须读取数组并一一转换数组中的对象。当然这种方法不是最快的,如果数组太大我不建议使用它,但它对我有用。
项目中需要包含Json库。如果您是在 android 上开发,则包括:
/**
* Convert JSON string to a list of objects
* @param sJson String sJson to be converted
* @param tClass Class
* @return List<T> list of objects generated or null if there was an error
*/
public static <T> List<T> convertFromJsonArray(String sJson, Class<T> tClass)
try
Gson gson = new Gson();
List<T> listObjects = new ArrayList<>();
//read each object of array with Json library
JSONArray jsonArray = new JSONArray(sJson);
for(int i=0; i<jsonArray.length(); i++)
//get the object
JSONObject jsonObject = jsonArray.getJSONObject(i);
//get string of object from Json library to convert it to real object with Gson library
listObjects.add(gson.fromJson(jsonObject.toString(), tClass));
//return list with all generated objects
return listObjects;
catch(Exception e)
e.printStackTrace();
//error: return null
return null;
【讨论】:
【参考方案6】:您可以使用以下代码在 Kotlin 中轻松完成此操作:
val fileData = "your_json_string"
val gson = GsonBuilder().create()
val packagesArray = gson.fromJson(fileData , Array<YourClass>::class.java).toList()
基本上,您只需要提供Array
的YourClass
个对象。
【讨论】:
你为什么使用 PrettyPrinting? @antroid 我忘了删除它^^【参考方案7】:[
id : '1',
title: 'sample title',
....
,
id : '2',
title: 'sample title',
....
,
...
]
检查此输出的简单代码
Gson gson=new GsonBuilder().create();
List<Post> list= Arrays.asList(gson.fromJson(yourResponse.toString,Post[].class));
【讨论】:
【参考方案8】:在 Kotlin 中:
val jsonArrayString = "['A','B','C']"
val gson = Gson()
val listType: Type = object : TypeToken<List<String?>?>() .getType()
val stringList : List<String> = gson.fromJson(
jsonArrayString,
listType)
【讨论】:
【参考方案9】:您可以在不使用 Type 对象的情况下获取 List 值。
EvalClassName[] evalClassName;
ArrayList<EvalClassName> list;
evalClassName= new Gson().fromJson(JSONArrayValue.toString(),EvalClassName[].class);
list = new ArrayList<>(Arrays.asList(evalClassName));
我已经测试过了,它正在工作。
【讨论】:
以上是关于如何使用 Gson 解析 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章
scala spray-json 如何解析一个复杂的 数组JSON
如何在 Android 的 Kotlin 中使用 GSON 将 JSON 对象转换为 JSON 数组