vin*_*v26 5 recursion serialization json jackson deserialization
我有一个递归对象 Node.java,我可以使用 Jackson 对其进行序列化,但无法将其反序列化回来。
节点.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;
}
}
Run Code Online (Sandbox Code Playgroud)
杰克逊序列化器
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();
}
}
Run Code Online (Sandbox Code Playgroud)
示例节点实例
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);
Run Code Online (Sandbox Code Playgroud)
生成的 JSON:
{
"id": "3",
"embeddedNodes": {
"second": {
"id": "2"
},
"first": {
"id": "1",
"embeddedNodes": {
"zero": {
"id": "0"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法为此编写相应的反序列化器,感谢任何帮助。
class NodeDeserializer extends JsonDeserializer<Node> {
@Override
public Node deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
//how do we write this??
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
经过几次尝试后,我想出了以下反序列化器,但不确定这是否是正确的方法:
private static class NodeDeserializer extends JsonDeserializer<Node> {
@Override
public Node deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonNode node = jp.getCodec().readTree(jp);
String id = node.get("id").asText();
Map<String, Node> embeddedNodes = Maps.newHashMap();
JsonNode embeddedNodesJsonNode = node.get("embeddedNodes");
if (embeddedNodesJsonNode != null) {
Iterator<String> embeddedElementNames = embeddedNodesJsonNode.fieldNames();
while (embeddedElementNames.hasNext()) {
String embedName = embeddedElementNames.next();
JsonNode jsonNode = embeddedNodesJsonNode.get(embedName);
Node embedNode = mapper.readValue(jsonNode.toString(), Node.class);
embeddedNodes.put(embedName, embedNode);
}
}
return new Node(id, embeddedNodes);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6286 次 |
最近记录: |