Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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/15.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 如何使用Jackson基于JSON反序列化列表或值?_Java_Json_Serialization_Jackson_Json Deserialization - Fatal编程技术网

Java 如何使用Jackson基于JSON反序列化列表或值?

Java 如何使用Jackson基于JSON反序列化列表或值?,java,json,serialization,jackson,json-deserialization,Java,Json,Serialization,Jackson,Json Deserialization,我有一个json,格式如下,其中in键表示属性类型,value表示该属性的值 { "attributes": [ { "key":"name", "value":"Archit" }, { "key":"website", "value":"stackoverflow" }, { "key":"languages", "value":[ "python", "java"

我有一个json,格式如下,其中in键表示属性类型,value表示该属性的值

{ "attributes":
[
  {
    "key":"name",
    "value":"Archit"
  },
  { 
    "key":"website",
    "value":"stackoverflow"
  },
  { 
    "key":"languages",
    "value":[
              "python",
              "java",
              "c++"
            ]
  }
]
}
我正在尝试使用jackson将其映射到以下java对象:

public class Attributes {
  List<Attribute> attributes;
}



public abstract class Attribute {
  String key;
}



public class SingleValuedAttribute extends Attribute{
  String value;
}


public class MultiValuedAttribute extends Attribute{
  List<String> value;
}


  ObjectMapper mapper = new ObjectMapper();
  Attributes attributes = mapper.readValue(new File(jsonFilePath), Attributes.class);
公共类属性{
列出属性;
}
公共抽象类属性{
字符串键;
}
公共类SingleValuedAttribute扩展属性{
字符串值;
}
公共类多值属性扩展属性{
列表值;
}
ObjectMapper mapper=新的ObjectMapper();
Attributes=mapper.readValue(新文件(jsonFilePath),Attributes.class);
我试着查看多态反序列化,但这需要json对象中的类型信息,而json对象中不存在类型信息

有什么建议吗

附言: 我无法更改json格式。
关键点列表没有边界/限制

我看不出
SingleValuedAttribute
MultiValuedAttribute
类之间的区别
SingleValuedAttribute
class表示一个元素数组。您可以通过删除POJO类层次结构来简化它

请参见下面的示例,它是什么样子的:

import java.io.File;
import java.util.Arrays;
import java.util.List;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonProgram {

    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

        File json = new File("/x/test.json");
        System.out.println(objectMapper.readValue(json, Attributes.class));
    }
}

class Attributes {

    private List<Attribute> attributes;

    //getters, setters
}

class Attribute {

    private String key;
    private List<String> value;

    //getters, setters
}

根据获得的是数组还是对象,您可能必须使用自定义的
JsonDeserializer
映射到
属性
实现。
[Attribute [key=name, value=[Archit]], Attribute [key=website, value=[stackoverflow]], Attribute [key=languages, value=[python, java, c++]]]