解析JSON并委托给JsonDeserializer中的defaultDeserializer

时间:2015-07-07 16:36:29

标签: java json jackson

为了反序列化地图,我需要读取json对象中的属性。

我添加了一个自定义反序列化器,它解析json并在上下文属性中设置找到的类型。此属性稍后在第二个反序列化器中使用,该反序列化器反序列化用户的自定义映射。

不幸的是,这个解决方案失败了,因为我正在更改jsonParser的currentToken。因此,defaultDeserializer无法继续解析响应。

  

引起:java.lang.NullPointerException at   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不是一种选择。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

我现在使用不同的方法。可以像这样得到当前的JsonNode:

    JsonNode rootNode = jsonParser.readValueAsTree();

可以使用以下方式获取基础json:

    rootNode.toString().

我在构建JsonDeserializer期间将引用存储到另一个nodemapper。然后我使用这个映射器反序列化剩余的json:

    mapper.readValue(rootNode.toString());
相关问题