java - 序列化嵌套对象json jackson

标签 java json serialization jackson objectmapper

我正在使用 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:

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

这里注释内省(introspection)器选择根元素,因为所有这些都是带有注释的 JAXB 类,如 @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。

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

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);

你的类(class)会是这样的:

@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"
    }
  }
}

关于java - 序列化嵌套对象json jackson,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38720246/

相关文章:

java - 在Java中使用什么方法键盘按键来移动东西而不是ActionListener

java - 如果你编译一个空的 java 文件会发生什么?

c++ libcurl - 使用前一个 curl 的响应作为另一个 curl 的参数

javascript - 处理 d3.js 轴上的日期

scala - 如何使用 play-json 编写和读取空案例类?

java - 实例化泛型类型 ArrayList<T>

windows - 帮助运行 Windows 命令的 Java 库/API

python - 为什么 python pickle 加载和转储会膨胀磁盘上对象的大小?

python - usn 解析器将类似 json 的数据转换为 pandas 数据帧

python - 如何比 cPickle 更快地将 1GB 的对象反序列化为 Python?