Java/w混合类型的Json反序列化,包含在一个数组中
考虑以下从公共API获取的json:Java/w混合类型的Json反序列化,包含在一个数组中,java,json,jackson,json-deserialization,Java,Json,Jackson,Json Deserialization,考虑以下从公共API获取的json: anyObject : { attributes: [ { "name":"anyName", "value":"anyValue" }, { "name":"anyName",
anyObject : {
attributes: [
{
"name":"anyName",
"value":"anyValue"
},
{
"name":"anyName",
"value":
{
"key":"anyKey",
"label":"anyLabel"
}
}
]
}
如您所见,有时值是一个简单的字符串,有时它是一个对象。是否有可能将这些json结果反序列化为:
class AnyObject {
List<Attribute> attributes;
}
class Attribute {
private String key;
private String label;
}
class AnyObject{
列出属性;
}
类属性{
私钥;
私有字符串标签;
}
我将如何设计模型以涵盖这两种情况。可能吗 尽管像其他人指出的那样难以管理,但你可以做你想做的事。添加自定义反序列化程序以处理此情况。我重写了你的bean,因为我觉得你的属性类有点误导。对象中的AttributeEntry类,它是该“attributes”列表中的一个条目。ValueObject是表示该“键”/“标签”对象的类。下面是这些bean,但这里是自定义反序列化程序。其思想是检查JSON中的类型,并根据其“值”类型实例化适当的AttributeEntry 以下是您的尝试:
public class AttributeEntry {
private String name;
private Object value;
public AttributeEntry(String name, String value) {
this.name = name;
this.value = value;
}
public AttributeEntry(String name, ValueObject attributes) {
this.name = name;
this.value = attributes;
}
/* getters/setters */
}
以下是ValueObject:
public class ValueObject {
private String key;
private String label;
/* getters/setters */
}
简而言之,如果您修复了JSON,那么回答是肯定的。这取决于你将要使用的框架。正如我已经提到的,我是从一个公共API获得的,所以我无法修复JSON。你只是修复了。键-值对之间用一个
=
符号分隔,该符号会暗示一个不可解析的JSON,该JSON将在编辑后消失。只是将=
与混在一起:
您需要用自己的反序列化机制覆盖默认的反序列化机制(StdDeserializer),并检查它是否是一个对象,返回一个类,否则返回一个值。阅读文档,
public class AttributeEntry {
private String name;
private Object value;
public AttributeEntry(String name, String value) {
this.name = name;
this.value = value;
}
public AttributeEntry(String name, ValueObject attributes) {
this.name = name;
this.value = attributes;
}
/* getters/setters */
}
public class ValueObject {
private String key;
private String label;
/* getters/setters */
}