如何将N-M关系输出为JSON?

11 浏览
0 Comments

如何将N-M关系输出为JSON?

我正在编写一个序列化器,将POJO序列化为JSON,但在循环引用问题上遇到了困难。在Hibernate的双向一对多关系中,父对象引用子对象,而子对象又引用回父对象,这导致我的序列化器出现问题(请参见下面示例代码)。\n如何打破这个循环?我们能否获取对象的所有者树来查看对象是否存在于其自身的所有者层次结构中?还有其他方法可以判断引用是否将成为循环引用吗?或者是否有其他解决这个问题的想法?

0
0 Comments

如何将N-M关系输出为JSON?

在处理对象图遍历时,处理循环的一种方法是跟踪到目前为止已经遍历过的对象(使用身份比较),以防止进入无限循环。

当然可以 - 只是没有原生的数据类型或结构来表示。但是任何东西都可以表示为XML、JSON或大多数其他数据格式。

我很好奇 - 你会如何在JSON中表示循环引用?

有多种方法:请记住,通常不仅仅是JSON,而是JSON和某些元数据的组合,最常见的是您用于绑定到/从JSON的类定义。对于JSON来说,只是一个问题,是使用某种对象标识性,还是重新创建链接(例如,Jackson库有一种特定的方式来表示父/子链接)。

0
0 Comments

问题出现的原因是,在处理N-M关系的JSON输出时,如何将父/子链接作为JSON进行输出。问题的解决方法是使用Jackson库的注解功能来处理这种父/子链接关系。Jackson 1.6版本已经具有了处理这种关系的支持。在处理序列化方面,大多数JSON处理包(如Jackson、Gson和Flex-json)已经支持排除父链接的序列化。但是,真正的难题是如何反序列化(重新创建父链接),而不仅仅是处理序列化方面。Jackson 2.0版本引入了真正的身份引用(identity references),因此可以通过使用Object Id来解决这个问题。然而,对于不同的方向,需要使用不同的注解来处理。因此,在以上情况下,Managed/Back references并不能解决问题。

0
0 Comments

如何将N-M关系输出为JSON?

问题的原因:

这个问题的出现是因为在处理N-M关系时,需要将其输出为JSON格式。在这种关系中,类A和类B之间存在双向关联。然而,使用Google JSON库时,由于循环引用的存在,无法直接将这种关系输出为JSON格式。

解决方法:

为了解决这个问题,可以使用Google JSON库中的一个特性,即通过排除策略来排除序列化和反序列化中的字段。具体步骤如下:

1. 创建类A和类B,并在类A中定义一个私有变量b,在类B中定义一个私有变量a。

2. 使用GsonBuilder创建一个自定义的Gson对象,并使用setExclusionStrategies方法来设置排除策略。在排除策略中,判断如果当前类是B类,则排除它。

3. 使用serializeNulls方法来序列化空值(默认情况下,Gson不会序列化空值)。

4. 创建类A和类B的实例,并建立双向关联。然后将实例a转换为JSON字符串。

5. 输出JSON字符串。

需要注意的是,这种解决方法只是通过移除循环引用来“解决”了问题,无法从生成的JSON中重新构建原始的数据结构。

代码如下:

public class A implements Serializable {
    private B b;
}
public class B implements Serializable {
    private A a;
}
Gson gson = new GsonBuilder()
    .setExclusionStrategies(new ExclusionStrategy() {
        public boolean shouldSkipClass(Class clazz) {
            return (clazz == B.class);
        }
        public boolean shouldSkipField(FieldAttributes f) {
            return false;
        }
     })
    .serializeNulls()
    .create();
A a = new A();
B b = new B();
a.setB(b);
b.setA(a);
String json = gson.toJson(a);
System.out.println(json);

通过使用Google JSON库中的排除策略,可以将N-M关系输出为JSON格式。然而,需要注意的是,这种解决方法只是通过移除循环引用来解决问题,并不能重新构建原始的数据结构。

0