【发布时间】:2014-06-10 10:33:31
【问题描述】:
我有一个递归对象 Node.java,我可以使用 Jackson 对其进行序列化,但无法将其反序列化。
Node.java
public class Node {
private final String id;
private final Map<String, Node> embeddedNodes;
public Node(String id, Map<String, Node> embeddedNodes) {
this.id = id;
this.embeddedNodes = embeddedNodes;
}
public String getId() {
return id;
}
public Map<String, Node> getEmbeddedNodes() {
return embeddedNodes;
}
}
杰克逊序列化程序
public static class NodeSerializer extends JsonSerializer<Node> {
@Override
public void serialize(Node node, JsonGenerator jgen, SerializerProvider provider) throws IOException{
jgen.writeStartObject();
jgen.writeStringField("id", node.getId());
Map<String, Node> embeddedNodesMap = node.getEmbeddedNodes();
if (!embeddedNodesMap.isEmpty()) {
jgen.writeObjectFieldStart("embeddedNodes");
for (Map.Entry<String, Node> entry : embeddedNodesMap.entrySet()) {
jgen.writeObjectField(entry.getKey(), entry.getValue());
}
jgen.writeEndObject();
}
jgen.writeEndObject();
}
}
示例节点实例
Node node0 = new Node("0", Maps.<String, Node>newHashMap());
Map<String, Node> embeddedNodes1 = Maps.newHashMap();
embeddedNodes1.put("zero", node0);
Node node1 = new Node("1", embeddedNodes1);
Node node2 = new Node("2", Maps.<String, Node>newHashMap());
Map<String, Node> embeddedNodes = Maps.newHashMap();
embeddedNodes.put("first", node1);
embeddedNodes.put("second", node2);
Node node3 = new Node("3", embeddedNodes);
String jsonStr = mapper.writeValueAsString(node3);
JSON 生成:
{
"id": "3",
"embeddedNodes": {
"second": {
"id": "2"
},
"first": {
"id": "1",
"embeddedNodes": {
"zero": {
"id": "0"
}
}
}
}
}
但我无法为此编写相应的反序列化器,不胜感激。
class NodeDeserializer extends JsonDeserializer<Node> {
@Override
public Node deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
//how do we write this??
return null;
}
}
【问题讨论】:
-
你找到解决方案了吗?
标签: json serialization recursion jackson deserialization