我有一个关于如何通过改造来执行这种反序列化的问题。
我有一个复杂的Json要解析:
{
"key":"value",
"rows" : [
{ //type 1 object
"type" : "the_type_1",
"self" :{
//type 1 subobject
}
},
{ //type 2 object
"type" : "the_type_2",
"self" : {
//type 2 subobject
}
},
{ //type 3 object
"type" : "the_type_3",
"self" : { //type 2 object with different key
"type" : "the_type_2",
"target":{
//type 2 subobject
}
}
}
]
}
我的每一行都可以有非常不同的内容,我已经对它进行了简化,但是你可以看到我有一些嵌套对象,这些对象在json中的深度方面有一些关键变化。
所以我的第一个解决方案是构建包含每种可能性的每个键的巨大Gson模型,并稍后测试"类型"各种字段,以了解访问的内容。但它非常难以维护,因此并不优雅。
我想我可以使用Gson Stream mode和自定义改装转换器做一些事情,但我不确切知道从哪里开始,也不知道它是否是正确的方法。
你会做什么?另外,我的帖子标题很糟糕,因为我没有提出更好的建议。请提出建议。
谢谢,
答案 0 :(得分:0)
<强>更新强>
制作此课程
public class Target {
}
制作此Self.java
import com.google.gson.annotations.SerializedName;
public class Self {
@SerializedName("type")
private String type;
@SerializedName("target")
private Target target;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Target getTarget() {
return target;
}
public void setTarget(Target target) {
this.target = target;
}
}
制作Row.java
import com.google.gson.annotations.SerializedName;
public class Row {
@SerializedName("type")
private String type;
@SerializedName("self")
private Self self;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Self getSelf() {
return self;
}
public void setSelf(Self self) {
this.self = self;
}
}
这是Respones.java
,它将使用gson
import java.util.ArrayList;
import com.google.gson.annotations.SerializedName;
public class Respones {
@SerializedName("key")
private String key;
@SerializedName("rows")
private ArrayList<Row> rows;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public ArrayList<Row> getRows() {
return rows;
}
public void setRows(ArrayList<Row> rows) {
this.rows = rows;
}
}
以下是检查类是否正常的测试代码,
您可以在代码中使用上述模型类,但严格遵循代码来匹配您的数据,绝不是生成JSON
数据的标准方法,您需要如何填充你的对象
import java.util.ArrayList;
import com.google.gson.Gson;
public class TestDrive {
public static void main(String[] args) {
// TODO Auto-generated method stub
Respones respones = new Respones();
respones.setKey("value");
ArrayList<Row> rows = new ArrayList<>();
Row one = new Row();
one.setType("the_type_1");
one.setSelf(new Self());
Row two = new Row();
two.setType("the_type_2");
two.setSelf(new Self());
Row three = new Row();
three.setType("the_type_3");
Self self = new Self();
self.setTarget(new Target());
self.setType("the_type_2");
three.setSelf(self);
rows.add(one);
rows.add(two);
rows.add(three);
respones.setRows(rows);
/**
* This code will convert your ArrayList object to a equivalent JSON
* String
*/
String result = (new Gson()).toJson(respones);
System.out.println(""+result);
/**
* This code will convert your JSON String to a equivalent Response
* Object
*/
Respones respones2 = (new Gson()).fromJson(result, Respones.class);
System.out.println(""+respones2.getKey());
System.out.println(""+respones2.getRows().get(0).getType());
System.out.println(""+respones2.getRows().get(2).getSelf().getType());
}
}
输出
{
"key": "value",
"rows": [
{
"type": "the_type_1",
"self": {
}
},
{
"type": "the_type_2",
"self": {
}
},
{
"type": "the_type_3",
"self": {
"type": "the_type_2",
"target": {
}
}
}
]
}
value
the_type_1
the_type_2