Java – parsing JSON using gson, objects sometimes contain lists and sometimes objects
                                        
                    •
                    Java                                    
                I'm using 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 is only one child, it will not return it as a list:
{ 'obj' : { children: {id: "1"} } }
My parser expects a list and then interrupts Does anyone have a suggestion on how to deal with this?
Solution
With gson, the only way I know how to handle this situation is to use 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 };
  }
}
                
                            The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
                        
                                            
                        THE END
                    
                    
                    
                                                        二维码
                        
                        
                                                
                        