【发布时间】:2016-07-31 12:41:50
【问题描述】:
我有一个自定义的JSON Deserializer,但它给出了一些错误(TreeNode<Department> 是一个 Java 树结构类)。
public TreeNode<Department> deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
return parseDepartment(jp);
}
private TreeNode<Department> parseDepartment(JsonParser jp) throws JsonProcessingException, IOException{
JsonNode node=jp.getCodec().readTree(jp);
if(node.has("name")){
String name=node.get("name").asText();
TreeNode<Department> n1 = new LinkedMultiTreeNode<Department>(new Department(name));
if(node.has("department")&&node.get("department").isArray()){
ArrayNode departments=(ArrayNode)node.get("department");
Collection<TreeNode<Department>> backNodes=parseDepartments(jp,departments);
if(backNodes!=null){
backNodes.forEach(e->{
n1.add(e);
});
}
}
return n1;
}
else{
return null;
}
}
还有另一个私有方法:
private Collection<TreeNode<Department>> parseDepartments(JsonParser jp,ArrayNode arrayNode) throws JsonProcessingException, IOException{
Collection<TreeNode<Department>> a=new HashSet<>();
JsonNode node=jp.getCodec().readTree(jp);
// why here "node" is null?
if(arrayNode==null) return null;
arrayNode.forEach(e->{
try {
log.info(e.toString());
TreeNode<Department> m=parseDepartment(jp);
if(m!=null){
a.add (m);
log.info(a.toString());
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
);
return a;
}
当我运行test:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(TreeNode.class, new DepartmentDeserializer());
mapper.registerModule(module);
TreeNode<Department> n=mapper.readValue(json, TreeNode.class);
System.out.println(n);
错误是:
java.lang.NullPointerException --jp.getCodec().readTree(jp)
【问题讨论】:
-
你能显示堆栈跟踪吗?
-
@cricket_007 这是错误详情:github.com/shell-software/tree/issues/2,谢谢。
-
好的 1) 你的问题应该是独立的,最好是minimal reproducible example 2) 部门解析器类的第 40 行是什么?
-
@cricket_007 谢谢。我刚刚解决了。
-
@KeryHu 我在这里聚会晚了 4 年,但如果您自己解决问题,您应该发布您的解决方案作为您自己问题的答案。
标签: java json spring-boot tree json-deserialization