Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 2中嵌套json数组(多类型对象)的JsonDeserializer_Android_Json_Gson_Retrofit2 - Fatal编程技术网

Android 2中嵌套json数组(多类型对象)的JsonDeserializer

Android 2中嵌套json数组(多类型对象)的JsonDeserializer,android,json,gson,retrofit2,Android,Json,Gson,Retrofit2,我的json响应 [ [ { "header_id": 1, "name" : "Tom", "group" : "A" }, { "header_id": 2, "name" : "Marry", "group" : "B" } ], [ {

我的json响应

[
     [
        {
          "header_id": 1,
          "name" : "Tom",
          "group" : "A"
        },
        {
          "header_id": 2,
          "name" : "Marry",
          "group" : "B"
         }
    ],

    [
         {
             "object_id" : 1,
             "SerialNo" : 123456
         },
         {
             "object_id" : 2,
             "SerialNo" : 89545
         }
     ],

     [
        {
           "workflow_id" : 1,
           "StatusName" : "start"
         },
         {
            "workflow_id" : 2,
            "StatusName" : "end"
          }

    ]
]
Header.class

public class Header{
    @SerializedName("header_id")
    private int HeaderID;
    @SerializedName("name")
    private String name;
    @SerializedName("group")
    private String group;
}
ObjectWork.class

public class ObjectWork {
    @SerializedName("object_id")
    private int ObjectID;
    @SerializedName("SerialNo")
    private int SerialNo;
}
工作流类

public class WorkFlow{
    @SerializedName("workflow_id")
    private int WorkflowID;
    @SerializedName("StatusName")
     private String statusName;
}
在json数组中,有三种类型的json对象。我将如何在2中设计pojo和定制JsonDeserializer。现在我使用gson来解析这个。我不知道如何设计类来支持这个json并将其反序列化到pojo模型


感谢您

通过链接直接从JSON生成pojo:


引入一个通用包装器,让Gson识别您的,因为Gson禁止
java.lang.Object
重写(请注意建议的fieldNamesCaseThatIsAlwaysCamelCase):

抽象类AbstractCommon{
}
最终类标题
扩展抽象公共{
@SerializedName(“标题\u id”)
最终int headerId=整数。valueOf(0);
@序列化名称(“名称”)
最终字符串名称=null;
@序列化名称(“组”)
最终字符串组=null;
@凌驾
公共字符串toString(){
返回headerId+“:”+名称;
}
}
final类ObjectWork
扩展抽象公共{
@SerializedName(“对象id”)
最终int objectId=整数。valueOf(0);
@SerializedName(“SerialNo”)
final int serialNo=Integer.valueOf(0);
@凌驾
公共字符串toString(){
返回objectId+“:”+serialNo;
}
}
最终类工作流
扩展抽象公共{
@SerializedName(“工作流id”)
final int workflowId=Integer.valueOf(0);
@SerializedName(“状态名”)
最终字符串statusName=null;
@凌驾
公共字符串toString(){
返回workflowId+“:”+statusName;
}
}
现在引入一个
JsonDeserializer
,它将尝试识别实际类型:

private static final Gson gson = new GsonBuilder()
        .registerTypeAdapter(AbstractCommon.class, (JsonDeserializer<AbstractCommon>) (jsonElement, type, context) -> {
            final JsonObject jsonObject = jsonElement.getAsJsonObject();
            if ( jsonObject.has("header_id") ) {
                return context.deserialize(jsonElement, Header.class);
            }
            if ( jsonObject.has("object_id") ) {
                return context.deserialize(jsonElement, ObjectWork.class);
            }
            if ( jsonObject.has("workflow_id") ) {
                return context.deserialize(jsonElement, WorkFlow.class);
            }
            throw new IllegalArgumentException("Cannot recognize: " + jsonElement);
        })
        .create();
private static Collection combine(最终列表公用){
@SuppressWarnings({“unchecked”,“rawtypes”})
最终列表头=(列表)commons.get(0);
@SuppressWarnings({“unchecked”,“rawtypes”})
最终列表objectWorks=(List)commons.get(1);
@SuppressWarnings({“unchecked”,“rawtypes”})
最终列表工作流=(列表)commons.get(2);
final Iterator headerIterator=headers.Iterator();
最终迭代器objectWorkIterator=objectWorks.Iterator();
最终迭代器workFlowIterator=workFlows.Iterator();
最终集合包装器=新的ArrayList();
while(headerierator.hasNext()&&objectWorkIterator.hasNext()&&workflowtiterator.hasNext()){
最终页眉=headerierator.next();
final ObjectWork ObjectWork=objectWorkIterator.next();
最终工作流=workFlowIterator.next();
最终包装=新包装(标题、对象工作、工作流);
添加(包装器);
}
返回包装;
}
联合收割机(公用)
.forEach(wrapper->System.out.println(wrapper.header+”,“+wrapper.objectWork+”,“+wrapper.workFlow));
输出:

1:Tom,1:123456,1:start
2:Marry,2:89545,2:end

private static final Gson gson = new GsonBuilder()
        .registerTypeAdapter(AbstractCommon.class, (JsonDeserializer<AbstractCommon>) (jsonElement, type, context) -> {
            final JsonObject jsonObject = jsonElement.getAsJsonObject();
            if ( jsonObject.has("header_id") ) {
                return context.deserialize(jsonElement, Header.class);
            }
            if ( jsonObject.has("object_id") ) {
                return context.deserialize(jsonElement, ObjectWork.class);
            }
            if ( jsonObject.has("workflow_id") ) {
                return context.deserialize(jsonElement, WorkFlow.class);
            }
            throw new IllegalArgumentException("Cannot recognize: " + jsonElement);
        })
        .create();