[英]Jackson JSON Array Value Deserialization
我正在尝试使用Jackson 2.8作为Retrofit响应的一部分来反序列化此JSON对象。 这是我从服务器获得的JSON响应。
{
"id":"8938209912"
"version":"1.1"
"cars":{
"mercedes":[
{
"property":"color"
},
{
"property":"price"
},
{
"property":"location"
}
],
"tesla":[
{
"property":"environment"
}
]
}
}
根据查询,上述cars
可能返回了一个或多个模型。 我无法为每个模型分别创建一个类,因为可以随意创建/删除它们。 对于汽车的每种型号(例如tesla
),可能会有一个或多个property
键值对。
我是Jackson
新手。 我一直在看几个示例,看起来自定义@JsonDeserialize
是最好的方法。 因此,我创建了Root
类和Cars
类,如下所示:
// In file Root.java
public class Root {
@JsonProperty("id")
private String id = null;
@JsonProperty("version")
private String version = null;
@JsonProperty("cars")
private Cars cars = null;
}
// In file Cars.java
public class Cars {
public Cars(){}
@JsonDeserialize(using = CarDeserializer.class)
private Map<String, List<Property>> properties;
public Map<String, List<Property>> getProperties() {
return properties;
}
public void setProperties(Map<String, List<Property>> properties) {
this.properties = properties;
}
}
// Property.java
public class Property {
@JsonProperty("property")
private String property;
}
我的反序列化器在下面。 但是,即使调用了空的构造函数,也根本不会调用parse方法本身!
// CarDeserializer.class
public class RelationshipDeserializer extends StdDeserializer<Map<String, List<Action>>>{
protected RelationshipDeserializer(){
super(Class.class);
}
@Override
public Map<String, List<Action>> deserialize(JsonParser parser, DeserializationContext ctx)
throws IOException, JsonProcessingException
{
// This method never gets invoked.
}
}
我的问题:
deserialize()
? (我检查过, cars
对象存在于JSON中。 Jackson
来解析此JSON? 永远不会调用“属性”反序列化器,因为它与该JSON中的任何内容都不匹配。 JSON中的字段名称为“ property”,并且与Map<String, List<Property>>
不匹配。 看起来它会更靠近List<Property>
您控制即将到来的JSON吗? 汽车名称/类型最好在其自己的字段中,而不要在对象名称中。 然后,您可以使用通用对象。 您现在所拥有的将被打破。 每当他们添加新的名称/类型,而您没有匹配的对象时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.