我有一个Android应用程序,它接收JSON格式的字符串。
JSON结构包含不同类型的JSON对象数组。 我将为每种类型创建一个类,并希望在JSON框架的帮助下直接从JSON实例化对象。
为简化起见,请考虑以下示例:
我们有两个Java类:
public class A
{
public String a1 = "";
public int a2 = 0;
}
public class B
{
public double b1 = 0;
public double b2 = 0;
public double b3 = 0;
}
也不是例如我们有一个JSON数组
[
{
"a1": "Teststring",
"a2": 12
},
{
"b1": 3,
"b2": 4,
"b3": 5
},
{
"a1": "Teststring2",
"a2": 24
}
]
我不知道JSON对象会进入哪个,有多少或以什么顺序进入。但我能够修改它们的JSON表示。
我能想到的一个解决方案:
据我阅读有关框架的理解,Jackson与GSON相比,能够同时执行这两项操作,读取特定值并生成Java实例。 所以我可以向JSON对象添加类型信息:
[
{
"type": "A",
"a1": "Teststring",
"a2": 12
},
{
"type": "B",
"b1": 3,
"b2": 4,
"b3": 5
},
{
"type": "A",
"a1": "Teststring2",
"a2": 24
}
]
比从类型中读取值,然后从中生成正确的对象。
您如何看待我的方法?我的问题是否有一个共同的解决方案?
答案 0 :(得分:2)
不是将所有内容都放在数组中,为什么不使用json对象并将对象作为成员添加到其中,使用通用名称 - 比方说 - 类型和一些索引。
{
"A0":
{ ... },
"B0":
{ ... },
"A1":
{ ... },
}
答案 1 :(得分:1)
如果你在数组中混合类型,你需要我认为简单的类型信息只需将JSON解析为List<Map<String,Object>>
,并在迭代时查看类型并使用
mapper.readValue(input, A.class)
或
mapper.readValue(input, B.class)
根据您遇到的类型。
您可以跳过此映射步骤,也可以在Map<String,Object>
上运行,以避免额外的开销。效率和漂亮的代码有时并不是齐头并进;)