Android 2中嵌套json数组(多类型对象)的JsonDeserializer
我的json响应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" } ], [ {
[
[
{
"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:start2: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();