使用GSON解析JSON,对象有时包含列表有时包含对象 [英] Parsing JSON with GSON, object sometimes contains list sometimes contains object

查看:109
本文介绍了使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆