为了反序列化地图,我需要读取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不是一种选择。
答案 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());