Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/w混合类型的Json反序列化,包含在一个数组中_Java_Json_Jackson_Json Deserialization - Fatal编程技术网

Java/w混合类型的Json反序列化,包含在一个数组中

Java/w混合类型的Json反序列化,包含在一个数组中,java,json,jackson,json-deserialization,Java,Json,Jackson,Json Deserialization,考虑以下从公共API获取的json: anyObject : { attributes: [ { "name":"anyName", "value":"anyValue" }, { "name":"anyName",

考虑以下从公共API获取的json:

 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 */
}