Джексон пытается десериализовать JSON в список типизированных объектов - PullRequest
7 голосов
/ 20 декабря 2011

Я пытаюсь использовать Джексона для десериализации свойства объекта, который является списком типизированных объектов.и я получаю следующую ошибку, когда я пытаюсь это сделать

Невозможно создать экземпляр типа [map type; class java.util.HashMap, [simple type, class java.lang.String] -> [simple type, class java.lang.String]] из строки JSON;нет однострокового конструктора / фабричного метода

Пока у меня есть следующее, но, похоже, оно не работает.

Terms.class

@JsonDeserialize(as=JsonMapDeserializer)
private List<ObjectA> results = null;   //ommitted getter and setters

Мой класс десериализатора выглядит следующим образом.

public class JsonMapDeserializer extends JsonDeserializer<List<ObjectA>> {

List<ObjectA> retMap = new ArrayList<ObjectA>();

TypeReference<HashMap<String,String>[]>  typeRef = new TypeReference<HashMap<String,String>[]>() {};

@Override
public List<ObjectA> deserialize(JsonParser parser, DeserializationContext ctx)
        throws IOException, JsonProcessingException {

    ObjectMapper mapper = new ObjectMapper(); 
    //read the json string into the map
    HashMap<String, String>[] maps = mapper.readValue(parser, typeRef); 
    if(maps != null) {
        for(HashMap<String, String> map : maps) {               
            ObjectA result = new ObjectA("id", map.get("id"));
            retMap.add(result);
        }
    }

    return retMap;
}

}

и я использую простые модули для добавления десериализатора следующим образом

ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule("safety", Version.unknownVersion());
        module.addDeserializer(List.class, new JsonMapDeserializer());
        mapper.registerModule(module);

Строка JSON, которую я пытаюсь десериализовать, выглядит следующим образом

"SearchTerms":{"results":[{id":"1010","checked":"true"}] // there are other fields I have just omitted them

Когда я запускаю код для десериализации, я получаю следующую трассировку стека

org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [map type; class java.util.HashMap, [simple type, class java.lang.String] -> [simple type, class java.lang.String]] from JSON String; no single-String constructor/factory method (through reference chain: com.model.search["searchTerm1"])
at org.codehaus.jackson.map.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:379)
at org.codehaus.jackson.map.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:268)
at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:244)
at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:33)
at org.codehaus.jackson.map.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:104)
at org.codehaus.jackson.map.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:18)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2695)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1294)
at com.az.rd.ke.json.JsonColumnMapDeserializer.deserialize(JsonColumnMapDeserializer.java:41)
at com.az.rd.ke.json.JsonColumnMapDeserializer.deserialize(JsonColumnMapDeserializer.java:27)
at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
at org.codehaus.jackson.map.deser.BeanDeserializer.

Из просмотра трассировки стека и отладки, потому что мой модуль был настроен следующим образом

module.addDeserializer(List.class, new JsonMapDeserializer());

При десериализации он, похоже, жалуется, как только достигает первого свойства в моем объекте, который является списком, потому что searchTerm1, на который он жалуется, это всего лишь список строк.

Кто-нибудь может посоветовать, пожалуйста, как мне десериализовать список типизированных объектов или как правильно добавить десериализатор.Если я изменил метод adddeserializer на

module.addDeserializer(List<ObjectA>.class, new JsonMapDeserializer());

, у него возникли проблемы с компилятором, потому что класс десериализатора был напечатан как List<ObjectA>.

1 Ответ

0 голосов
/ 01 марта 2019

похоже, что объект, который вы хотите десериализовать, является Map<String, List<Map<String,String>>>, а не List<Map<String,String>>.

Может, попробовать вместо этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...