Java 如何使用Jackson基于JSON反序列化列表或值?
我有一个json,格式如下,其中in键表示属性类型,value表示该属性的值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"
{ "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++]]]