有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jackson或Gson以mapKey作为实体对实体进行序列化/反序列化

我的节点类

public class Node<T> {
    private T data;
    private Node<T> parent;
    private HashMap<Node<T>, String> children = new HashMap<>();
}

我的国家班

public class State {
    private String name;
    private Boolean endState;
}

我的树课

public class Tree<T> {
    private Node<T> root;
    public Tree() {
}

public Tree(T rootData) {
    root = new Node<T>();
    root.setData(rootData);
}

public Node<T> getRoot() {
    return root;
}

我的主课

public class Main {
    public static void main(String[] args) throws IOException {
        Tree<State> stateMachine = new Tree<>(new State("q1", false));
        Node<State> q2 = new Node<>(new State("q2", true), stateMachine.getRoot());
        stateMachine.getRoot().addChild(q2, "a");
        stateMachine.getRoot().addChild(stateMachine.getRoot(), "a");

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        new ObjectMapper().writer().writeValue(os, stateMachine);
        String json = os.toString();
        os.close();

        System.out.println(json);
    }
}

我得到的结果是

{
  "root":{
    "data":{
      "name":"q1",
      "endState":false
    },
    "parent":null,
    "children":{
      "entity.Node@7adf9f5f":"a",
      "entity.Node@85ede7b":"a"
    }
  }
}

我不知道如何避免陷入无限递归,如何完全序列化/反序列化我的对象


共 (1) 个答案

  1. # 1 楼答案

    根据Json specification,Json字符串中的键必须是字符串。因此,首先,您必须为地图创建自定义序列化程序。当然,你也想要反序列化它,所以你也需要自定义反序列化程序

    接下来会出现下一个问题:在反序列化过程中,您希望对同一字符串的所有匹配项使用相同的“key”对象。所以你必须找到已经实例化的密钥。最简单的方法是,如果将所有节点存储在列表中,并使用节点对象本身作为键,则可以使用其在列表中的位置

    通过这种方式,键可以是整数的字符串表示,也可以轻松创建自定义反序列化