使用Jackson将多个JSON对象转换为单个JSON。

15

我有一个JSON文件,其中包含不同层次的字段,因此我希望将其转换为一个只包含单层字段的JSON文件,例如:

{
  "prop1":"value1",
  "prob2":"value2",
  "prop3": {
     "prop4":"value4",
     "prop5":"value5"
  }
  ... many level fields
}  

结果

{
  "prop1":"value1",
  "prop2":"value2",
  "prop4":"value4",
  "prop5":"value5"
  .......
}

我正在使用带有注释@JsonProperty("field")的Jackson,对于第一层级的字段没问题,但我不知道如何访问更深层次的JSON中的字段,例如prop4prop5

2个回答

21

JsonUnwrapped是要使用的注释,它甚至适用于多层嵌套。例如:

@RunWith(JUnit4.class)
public class Sample {

    @Test
    public void testName() throws Exception {
        SampleClass sample = new SampleClass("value1", "value2", new SubClass("value4", "value5", new SubSubClass("value7")));
        new ObjectMapper().writeValue(System.out, sample);
    }

    @JsonAutoDetect(fieldVisibility=Visibility.ANY)
    public static class SampleClass {
        private String prop1;
        private String prop2;
        @JsonUnwrapped
        private SubClass prop3;

        public SampleClass(String prop1, String prop2, SubClass prop3) {
            this.prop1 = prop1;
            this.prop2 = prop2;
            this.prop3 = prop3;
        }
    }
    @JsonAutoDetect(fieldVisibility=Visibility.ANY)
    public static class SubClass {
        private String prop4;
        private String prop5;
        @JsonUnwrapped
        private SubSubClass prop6;
        public SubClass(String prop4, String prop5, SubSubClass prop6) {
            this.prop4 = prop4;
            this.prop5 = prop5;
            this.prop6 = prop6;
        }

    }
    @JsonAutoDetect(fieldVisibility=Visibility.ANY)
    public static class SubSubClass{
        private String prop7;

        public SubSubClass(String prop7) {
            this.prop7 = prop7;
        }
    }
}

将会生成

{"prop1":"value1","prop2":"value2","prop4":"value4","prop5":"value5","prop7":"value7"}

太好了!非常感谢提供的信息,使用JsonUnwrapped是一个很好的替代方案。但是,我需要创建第二个实现类并使用提到的注解。接下来的问题是,是否存在一种方法可以生成所有未包装的JSON字段,只需修改映射器功能即可? - cflores29
如果您不想修改原始类,可以使用Mixin机制:http://wiki.fasterxml.com/JacksonMixInAnnotations。不过,没有任何功能可以在ObjectMapper上激活以实现这一点。 - Pascal Gélinas

0

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