如何使 Jackson 数据绑定与 Json.Net 通信

How to make Jackson databind communicate with Json.Net

提问人:zambotn 提问时间:10/13/2023 更新时间:10/13/2023 访问量:24

问:

因此,假设我在两个对象之间具有双向关系(省略了 getter 和 setter):

    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
            property="$id")
    public class Author {
        @JsonProperty("$id")
        private int id;
        private String name;
        private List<Book> books;
    }
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
            property="$id")
    public class Book {
        @JsonProperty("$id")
        private int id;
        private String title;
        private List<Author> authors;
    }

然后,我可以创建一个要序列化的对象:

        Author tolkien = new Author();
        tolkien.id = 1;
        tolkien.name = "J.R.R. Tolkien";
        tolkien.books = Arrays.asList(new Book(), new Book());
        tolkien.books.get(0).id = 2;
        tolkien.books.get(0).title = "Lord of the Rings";
        tolkien.books.get(0).authors = List.of(tolkien);
        tolkien.books.get(1).id = 3;
        tolkien.books.get(1).title = "The Dragon Hunter";
        tolkien.books.get(1).authors = List.of(tolkien);

        System.out.println(objectMapper.writeValueAsString(tolkien));

这将打印:

{
  "$id" : 1,
  "name" : "J.R.R. Tolkien",
  "books" : [ {
    "$id" : 2,
    "title" : "Lord of the Rings",
    "authors" : [ 1 ]
  }, {
    "$id" : 3,
    "title" : "The Dragon Hunter",
    "authors" : [ 1 ]
  } ]
}

这是 99% 的工作,但 JSON.NET 序列化对象引用的方式更接近 JSON Schema 标准,并使用类似的 API,将引用编写为对象而不仅仅是 id(恕我直言,这要好得多,因为它允许从数据中识别引用):

{
  "$id" : 1,
  "name" : "J.R.R. Tolkien",
  "books" : [ {
    "$id" : 2,
    "title" : "Lord of the Rings",
    "authors" : [ {"$ref": 1} ]
  }, {
    "$id" : 3,
    "title" : "The Dragon Hunter",
    "authors" : [ {"$ref": 1} ]
  } ]
}

如何使这两个服务从 Java/Jackson 端互操作(我无法修改 .NET 代码)?

java json 杰克逊 jackson-databind

评论


答: 暂无答案