2015-07-07 1 views
1

Чтобы десериализовать карту, мне нужно прочитать свойство в моем объекте json.Parse JSON и делегат по умолчаниюDeserializer в JsonDeserializer

Я добавил пользовательский десериализатор, который анализирует json и задает найденный тип в атрибуте контекста. Этот атрибут позже используется во втором десериализаторе, который десериализует пользовательскую карту пользователя.

К сожалению, это решение не сработало, так как я изменяю currentToken jsonParser. Следовательно, defaultDeserializer не может продолжить синтаксический анализ ответа.

Вызванный: java.lang.NullPointerException на com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther (BeanDeserializer.java:151) на com.fasterxml.jackson.databind.deser.BeanDeserializer .deserialize (BeanDeserializer.java:144) на UserDeserializer.deserialize (UserDeserializer.java:36)

@Override 
public User deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException { 

    JsonNode node = jsonParser.readValueAsTree(); 
    JsonNode typeNode = node.get("type"); 
    String typeName = schemaNode.get("name").textValue(); 
    ctxt.setAttribute("typeName", typeName); 

    User userResponse = (User) defaultDeserializer.deserialize(jsonParser, ctxt); 
    return userResponse; 

} 

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

{ 
    "username": "test", 
    "type": { "name": "testtype" }, 
    "map": { "test": 1234 } 
} 

Есть ли способ сбросить парсер json или использовать другой? Или можно использовать конкретный JsonNode для десериализации?

Изменение json не является вариантом.

ответ

0

Теперь я использую другой подход. Можно получить текущий JsonNode так:

JsonNode rootNode = jsonParser.readValueAsTree(); 

Основополагающий JSON может быть извлечена с помощью:

rootNode.toString(). 

Я хранить Refernce к другому nodemapper во время строительства JsonDeserializer. Затем я использую этот преобразователь для десериализации оставшегося json:

mapper.readValue(rootNode.toString()); 
0

Вы можете использовать ObjectMapper вместо

@Override 
public User deserialize(String jsonString) throws IOException, JsonProcessingException { 

    ObjectMapper objectMapper = new ObjectMapper(); 

    User user = objectMapper.readValue(jsonString, User.class); 

    return user; 

} 

Или использовать ObjectMapper и заселить Пользователя от его сеттеры, если он имеет какие-либо.

@Override 
public User deserialize(String jsonString) throws IOException, JsonProcessingException { 

    ObjectMapper objectMapper = new ObjectMapper(); 
    HashMap<String, Object> map = new HashMap<String, Object>(); 

    map = objectMapper.readValue(jsonString, HashMap.class); 
    User user = new User(); 
    user.setUsername(map.get("username")); 
    user.setType(map.get("type")); 
    user.setMap(map.get("map")); 

    return user; 
} 
+0

Я не вижу, как это решает проблему. Он просто показывает, как десериализовать json двумя разными способами. Можете ли вы, возможно, разработать? – Jotschi

+0

Прошу прощения. Возможно, я не понял первоначальный вопрос. Трассировка стека и фрагмент кода не ясны, и я думал, что вы пытаетесь опровергнуть объект Json в объект. – deanw