序列化嵌套对象 json jackson
Serialize nested object json jackson
我正在使用 Jackson json 库将我的 POJO 转换为 json:
public class A {
public String name;
public B b;
}
public class B {
public Object representation;
public String bar;
}
我想将 A
的实例序列化为 JSON。我将使用来自 Jackson:
的 ObjectMapper
class
objectMapperPropertiesBuilder.setSerializationFeature(SerializationFeature.WRAP_ROOT_VALUE);
objectMapperPropertiesBuilder.setAnnotationIntrospector(new CustomAnnotionIntrospector());
此处注释内省器选择根元素,因为所有这些都是 JAXB classes,带有 @XmlRootElement
和 @XmlType
:
等注释
例如:如果我在 Object
表示中设置:
public class C {
public BigInteger ste;
public String cr;
}
使用此代码,我的 JSON 将如下所示:
rootA: {
"name": "MyExample",
"b": {
"rep": {
"ste": 7,
"cr": "C1"
},
"bar": "something"
}
}
但我也希望将根元素附加到我的嵌套 Object
。对象可以是任何自定义的 POJO。
所以在这种情况下,我希望 class C
的根元素附加在我的 JSON 转换中。所以:
rootA: {
"name": "MyExample",
"b": {
"rep": {
"rootC": {
"ste": 7,
"cr": "C1"
}
},
"bar": "something"
}
}
如何在 JSON 转换中添加嵌套对象的根元素?我指定的所有 objectMapper
属性都将适用于 class A
。我是否必须编写自定义序列化程序才能将某些属性应用于嵌套对象?
您可以为此使用自定义序列化程序。但是,实现您想要的最简单方法是使用 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"
}
}
}
我正在使用 Jackson json 库将我的 POJO 转换为 json:
public class A {
public String name;
public B b;
}
public class B {
public Object representation;
public String bar;
}
我想将 A
的实例序列化为 JSON。我将使用来自 Jackson:
ObjectMapper
class
objectMapperPropertiesBuilder.setSerializationFeature(SerializationFeature.WRAP_ROOT_VALUE);
objectMapperPropertiesBuilder.setAnnotationIntrospector(new CustomAnnotionIntrospector());
此处注释内省器选择根元素,因为所有这些都是 JAXB classes,带有 @XmlRootElement
和 @XmlType
:
例如:如果我在 Object
表示中设置:
public class C {
public BigInteger ste;
public String cr;
}
使用此代码,我的 JSON 将如下所示:
rootA: {
"name": "MyExample",
"b": {
"rep": {
"ste": 7,
"cr": "C1"
},
"bar": "something"
}
}
但我也希望将根元素附加到我的嵌套 Object
。对象可以是任何自定义的 POJO。
所以在这种情况下,我希望 class C
的根元素附加在我的 JSON 转换中。所以:
rootA: {
"name": "MyExample",
"b": {
"rep": {
"rootC": {
"ste": 7,
"cr": "C1"
}
},
"bar": "something"
}
}
如何在 JSON 转换中添加嵌套对象的根元素?我指定的所有 objectMapper
属性都将适用于 class A
。我是否必须编写自定义序列化程序才能将某些属性应用于嵌套对象?
您可以为此使用自定义序列化程序。但是,实现您想要的最简单方法是使用 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"
}
}
}