繁体   English   中英

Jackson JSON数组值反序列化

[英]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.
        }
     }

我的问题:

  1. 首先这是正确的方法吗?
  2. 您为什么认为执行永远不会到达deserialize() (我检查过, cars对象存在于JSON中。
  3. 是否有更好的方法使用Jackson来解析此JSON?

永远不会调用“属性”反序列化器,因为它与该JSON中的任何内容都不匹配。 JSON中的字段名称为“ property”,并且与Map<String, List<Property>>不匹配。 看起来它会更靠近List<Property>

您控制即将到来的JSON吗? 汽车名称/类型最好在其自己的字段中,而不要在对象名称中。 然后,您可以使用通用对象。 您现在所拥有的将被打破。 每当他们添加新的名称/类型,而您没有匹配的对象时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM