使用GSON解析JSON,对象有时包含列表有时包含对象 [英] Parsing JSON with GSON, object sometimes contains list sometimes contains object
本文介绍了使用GSON解析JSON,对象有时包含列表有时包含对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在处理一个有时包含子对象列表的API:
{'obj':{children :[{id:1},{id:2}]}}
I可以解析这个没问题。但如果只有一个孩子,它不会将其作为列表返回:
{'obj':{children:{id :1}}}
我的解析器需要一个列表然后中断。有没有人有如何处理这个问题的建议?
解决方案 使用Gson,我知道如何处理像这是一个自定义的Deserializer。例如:
//输出:
// [容器:obj = [ChildContainer:children = [[Child :id = 1],[Child:id = 2]]]]
// [Container:obj = [ChildContainer:children = [[Child:id = 1]]]]
public class Foo
{
static String json1 ={\obj\:{\children \:[{\id \:\1 \ },{\ id\ :\ 2\ }]}};
static String json2 ={\obj\:{\children \:{\id \:\1 \}}};
public static void main(String [] args)
{
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
gsonBuilder.registerTypeAdapter(Child []。class,new ChildrenDeserializer());
Gson gson = gsonBuilder.create();
Container container1 = gson.fromJson(json1,Container.class);
System.out.println(container1);
容器container2 = gson.fromJson(json2,Container.class);
System.out.println(container2);
}
}
类容器
{
ChildContainer obj;
$ b $ @Override
public String toString()
{
return String.format([Container:obj =%1 $ s],obj);
}
}
class ChildContainer
{
Child [] children;
@Override
public String toString()
{
return String.format([ChildContainer:children =%1 $ s],Arrays.toString(孩子们));
}
}
class Child
{
String id;
$ b @Override
public String toString()
{
return String.format([Child:id =%1 $ s],id);
}
}
类ChildrenDeserializer实现了JsonDeserializer< Child []>
{
@Override
public Child [] deserialize(JsonElement json,Type typeOfT,JsonDeserializationContext context)
throws JsonParseException
{
if(json instanceof JsonArray )
{
return new Gson()。fromJson(json,Child []。class);
}
Child child = context.deserialize(json,Child.class);
返回新的Child [] {child};
}
}
I'm working with an API that sometimes contains a list of child objects:
{ 'obj' : { children: [ {id: "1"}, {id: "2"} ] } }
I can parse this no problem. But if there just one child it doesn't return it as a list:
{ 'obj' : { children: {id: "1"} } }
My parser which expects a list then breaks. Does anyone have a suggestion for how to deal with this?
解决方案
With Gson, the only way I know how to handle situations like this is with a custom Deserializer. For example:
// outputs:
// [Container: obj=[ChildContainer: children=[[Child: id=1], [Child: id=2]]]]
// [Container: obj=[ChildContainer: children=[[Child: id=1]]]]
public class Foo
{
static String json1 = "{\"obj\":{\"children\":[{\"id\":\"1\"},{\"id\":\"2\"}]}}";
static String json2 = "{\"obj\":{\"children\":{\"id\":\"1\"}}}";
public static void main(String[] args)
{
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
gsonBuilder.registerTypeAdapter(Child[].class, new ChildrenDeserializer());
Gson gson = gsonBuilder.create();
Container container1 = gson.fromJson(json1, Container.class);
System.out.println(container1);
Container container2 = gson.fromJson(json2, Container.class);
System.out.println(container2);
}
}
class Container
{
ChildContainer obj;
@Override
public String toString()
{
return String.format("[Container: obj=%1$s]", obj);
}
}
class ChildContainer
{
Child[] children;
@Override
public String toString()
{
return String.format("[ChildContainer: children=%1$s]", Arrays.toString(children));
}
}
class Child
{
String id;
@Override
public String toString()
{
return String.format("[Child: id=%1$s]", id);
}
}
class ChildrenDeserializer implements JsonDeserializer<Child[]>
{
@Override
public Child[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException
{
if (json instanceof JsonArray)
{
return new Gson().fromJson(json, Child[].class);
}
Child child = context.deserialize(json, Child.class);
return new Child[] { child };
}
}
这篇关于使用GSON解析JSON,对象有时包含列表有时包含对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文