2017-01-02 3 views
0

Pour analyser cet objet JSON:Vous ne trouvez pas un (Carte) désérialiseur clé pour le type [type simple, classe java.lang.Class] à Jackson désérialisation JSON en classe

{"topology": [ 
{"id": "4cdbc040-657a-4847-b266-7e31d9e2c3d9","name": "PhysicalTOPO","layer": "datalink","nodes": null,"links": null,"sub-layer": "ethernet"}, 
{"id": "4acbd130-846b-3536-a142-8a42d8a3c4b8","name": "LogicalTOPO","layer": "ip","nodes": null,"links": null,"sub-layer": "ethernet"}, 
{"id": "9acbd139-946b-9536-a149-9a42d9a3c4b9","name": "NetworkTOPO","layer": "ip","nodes": null,"links": null,"sub-layer": "ethernet"} 
]} 

J'ai créé VO classe et analyser fonction ci-dessous:

public class TopologyVo extends Vo { 
    @JsonProperty("topology") 
    public Topology[] topology; 
    //public List<Topology> topology; -- both have same exception 

    public static class Topology extends Vo{ 
     @JsonProperty("id") 
     public String id; 
     @JsonProperty("name") 
     public String name; 
     @JsonProperty("layer") 
     public String layer; 
     @JsonProperty("nodes") 
     public Object nodes; // it does not matter to map null to Object now 
     @JsonProperty("links") 
     public Object links; 
     @JsonProperty("sub-layer") 
     public String subLayer; 
    } 
} 

// caller 
... 
TopologyVo vo = (TopologyVo)parse(content, TopologyVo.class); 
... 

public Object parse(String input, Class<?> mapClass) throws Exception { 
    Object object = null; 
    ObjectMapper mapper = new ObjectMapper(); 

    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    object = mapper.readValue(input, mapClass); 
    return object; 
} 

Résulté une exception:

com.fasterxml.jackson.databind.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class java.lang.Class] 
at com.fasterxml.jackson.databind.deser.DeserializerCache._handleUnknownKeyDeserializer(DeserializerCache.java:580) 
at com.fasterxml.jackson.databind.deser.DeserializerCache.findKeyDeserializer(DeserializerCache.java:170) 
at com.fasterxml.jackson.databind.DeserializationContext.findKeyDeserializer(DeserializationContext.java:404) 
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.createContextual(MapDeserializer.java:232) 
at com.fasterxml.jackson.databind.DeserializationContext.handleSecondaryContextualization(DeserializationContext.java:572) 
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:369) 
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:697) 
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:438) 
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:294) 
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:243) 
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:144) 
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:381) 
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3095) 
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2989) 
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2098) 
at test.ApiTest.parse(ApiTest.java:195) 

comme il n'y a pas de carte dans ma classe VO, je ha Je ne sais pas comment implémenter "désérialiseur clé" dans la réponse à la question similaire (Can not find a (Map) Key deserializer for type [simple type, class com.comcast.ivr.core.domain.AutoHandlingSlotKey]). Ce problème provient-il du tableau (ou de la liste/collection) de la sous-classe dans VO?

Répondre

1

Cela fonctionne parfaitement pour moi:

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

public class Main { 

    public static void main(String[] args) throws Exception { 
     String jsonStr = "{\"status\": \"OK\",\"origin_addresses\": [ \"Vancouver, BC, Canada\", \"Seattle, État de Washington, États-Unis\" ],\"destination_addresses\": [ \"San Francisco, Californie, États-Unis\", \"Victoria, BC, Canada\" ],\"rows\": [ {\"elements\": [ {\"status\": \"OK\",\"duration\": {\"value\": 340110,\"text\": \"3 jours 22 heures\"},\"distance\": {\"value\": 1734542,\"text\": \"1 735 km\"}}, {\"status\": \"OK\",\"duration\": {\"value\": 24487,\"text\": \"6 heures 48 minutes\"},\"distance\": {\"value\": 129324,\"text\": \"129 km\"}} ]}, {\"elements\": [ {\"status\": \"OK\",\"duration\": {\"value\": 288834,\"text\": \"3 jours 8 heures\"},\"distance\": {\"value\": 1489604,\"text\": \"1 490 km\"}}, {\"status\": \"OK\",\"duration\": {\"value\": 14388,\"text\": \"4 heures 0 minutes\"},\"distance\": {\"value\": 135822,\"text\": \"136 km\"}} ]} ]}"; 

     TopologyVo vo = (TopologyVo) parse(jsonStr, TopologyVo.class); 
     System.out.println(vo); 
    } 

    public static Object parse(String input, Class<?> mapClass) 
      throws Exception { 
     Object object = null; 
     ObjectMapper mapper = new ObjectMapper(); 

     mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, 
       false); 
     object = mapper.readValue(input, mapClass); 
     return object; 
    } 
} 

class Vo { 

} 

class TopologyVo extends Vo { 
    @JsonProperty("topology") 
    public Topology[] topology; 

    static class Topology extends Vo { 
     @JsonProperty("id") 
     public String id; 
     @JsonProperty("name") 
     public String name; 
     @JsonProperty("layer") 
     public String layer; 
     @JsonProperty("nodes") 
     public Object nodes; // it does not matter to map null to Object now 
     @JsonProperty("links") 
     public Object links; 
     @JsonProperty("sub-layer") 
     public String subLayer; 
    } 

} 
+1

Comme je l'ai lu votre réponse, je compris que la classe parente Vo avait la carte de propriété. Retrait étendu a résolu le problème pour moi. Je vous remercie. –