我今天的问题是我有这种 JSON,
具有对象数组,每个对象都有
两个属性:type
和 value
。
[{
"type": "Boolean",
"value": false
}, {
"type": "String[]",
"value": ["one", "two", "three"]
}]
如您所见,value
类取决于type
。
我可能有一个 type: MyClass
,其中 value
是一个复杂的对象。
我希望能够反序列化这个数组(并将其序列化回来 之后转换为 JSON)。
我开始研究 Gson图书馆,但我可能随时改变。 根据我所读到的内容,我只知道一种方法:
public class MyExtractor implements JsonDeserializer<Object> {
@Override
public Object deserialize(JsonElement elem, Type jtype,
JsonDeserializationContext jdc) throws JsonParseException {
// elem is an object
JsonObject obj = elem.getAsJsonObject();
String type = obj.get("type").getAsString();
// Return a different kind of Object depending on the 'type' attr
switch (type) {
case "Boolean":
Boolean bool = obj.get("value").getAsBoolean();
return bool;
case "String[]":
JsonArray data = obj.get("value").getAsJsonArray();
List<String> list = new ArrayList<String>();
for (JsonElement item : data) {
list.add(item.getAsString());
}
return list;
}
}
}
在这里,我添加代码将每个类型
与其正确的类相关联。
这可能会如我所愿,但有更好的方法吗?
这最终需要相当多的模板。
此外,反序列化的项目被转换为 Object
所以我不
无需读取其 getClass()
即可访问其方法,并且
将它们转换回来,我无法从 overloading 中受益.
是否存在针对该问题采取不同方法的库?
最佳答案
如果您可以更改原始 json:
[{
"type": "Boolean",
"value": false
}, {
"type": "String[]",
"value": ["one", "two", "three"]
}]
至
[false, ["one", "two", "three"]]
您可以简单地将其反序列化为
String jsonString = ...
Object[] result = new Gson().fromJson(jsonString, Object[].class);
这对于每个标准类型(String
、Boolean
、Integer
...)都适用,对于自定义类,它将创建一个 map
。
例如,如果 jsonString
有内容
["testString", false, {"name":"Davide", "surname":"Marino"}]
它将生成一个对象数组:
- 第一个位置的
String
testString - 第二个位置的
boolean 值
false - 具有属性 name(值为 Davide)和 surname(值为 Marino) 第三位
如果您不需要处理现有的 java 类,但您有 3 4 个自定义类,则可以使用多态反序列化。
基本上,您需要创建一个自定义接口(interface)(或基类)并实现(或扩展)它。 要查看更完整的示例,请参阅已接受的答案
关于java - 反序列化为动态 Java 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47141116/