嵌套对象的JSON序列化Jackson

3
我正在使用Jackson json库将我的POJO对象转换为json格式:
    public class A {
        public String name;
        public B b;
    }

    public class B {
        public Object representation;
        public String bar;
    }

我想将一个A实例序列化为JSON格式。我将使用来自JacksonObjectMapper类:

objectMapperPropertiesBuilder.setSerializationFeature(SerializationFeature.WRAP_ROOT_VALUE);
objectMapperPropertiesBuilder.setAnnotationIntrospector(new CustomAnnotionIntrospector());

这里的注解内省器会将根元素选为所有具有注解 @XmlRootElement@XmlType 的JAXB类:

例如:如果我在 Object 表示中设置:

    public class C {
        public BigInteger ste;
        public String cr;
    }

使用这段代码,我的JSON看起来会像这样:
rootA: {
  "name": "MyExample",
  "b": {
    "rep": {
      "ste": 7,
      "cr": "C1"
    },
    "bar": "something"
  }
}

但我希望将根元素附加到我的嵌套Object中。 Object可以是任何自定义POJO。

因此,在这种情况下,我希望将类C的根元素附加在我的JSON转换中。所以:

rootA: {
  "name": "MyExample",
  "b": {
    "rep": {
      "rootC": {
        "ste": 7,
        "cr": "C1"
      }
    },
    "bar": "something"
  }
}

我该如何在JSON转换中添加嵌套对象的根元素?我指定的所有objectMapper属性都将适用于Class A。我需要编写自定义序列化器来将某些属性应用于嵌套对象吗?


请注意,您在问题中提供的JSON无效。您可以在此处进行验证(http://jsonlint.com/)。 - cassiomolin
1个回答

1
您可以使用自定义序列化程序来实现。但是,实现您想要的最简单的方法是使用一个Map来包装C实例:
Map<String, Object> map = new HashMap<>();
map.put("rootC", c);

你的类会像这样:
@JsonRootName(value = "rootA")
public class A {
    public String name;
    public B b;
}

public class B {
    @JsonProperty("rep")
    public Object representation;
    public String bar;
}

public class C {
    public BigInteger ste;
    public String cr;
}

创建JSON的代码如下:

A a = new A();
a.name = "MyExample";

B b = new B();
b.bar = "something";

C c = new C();
c.cr = "C1";
c.ste = new BigInteger("7");

a.b = b;

Map<String, Object> map = new HashMap<>();
map.put("rootC", c);
b.representation = map;

ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
mapper.enable(SerializationFeature.INDENT_OUTPUT);

String json = mapper.writeValueAsString(a);

而生成的JSON将是:
{
  "rootA" : {
    "name" : "MyExample",
    "b" : {
      "rep" : {
        "rootC" : {
          "ste" : 7,
          "cr" : "C1"
        }
      },
      "bar" : "something"
    }
  }
}

这个可以工作,但是设置输入不在我的掌控之中。我得到一个填充的对象,我必须将其序列化,所以我不是设置 Map 的人(客户端会这样做)。那么我应该选择自定义序列化器吗? - Siddharth Trikha
如果我选择自定义序列化器,我只想使用自定义方式对“representation”部分进行序列化,而其他所有属性都使用我在根类中设置的“ObjectMapper”属性进行序列化。如何实现这一点? - Siddharth Trikha
此外,我的POJO也不能编辑注解。必须使用“ObjectMapper”。 - Siddharth Trikha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接