Java jackson如何在序列化期间解包原始值?

时间:2016-10-10 17:47:30

标签: java json serialization jackson dto

在Java中使用Jackson json库,是否可以执行以下操作:

public class MyObject {
     @JsonRawValue
     @JsonUnwrapped
     private String rawJson;

}

public class DTO {

     public MyObject json;

}

rawJson示例:

{
    "key": "value"
}

当DTO被序列化并呈现为json时,我希望JSON看起来像:

{
   "dto": {
         "key":"value"

    }
}

相反,它总是:

{
   "dto":{
      "rawJson":{
         "key":"value"
      }
   }
}

基本上似乎当你的一个属性是存储在带有@JsonRawValue的字符串中的JSON值时,@ JsonUnwrapped不起作用。

理想情况下,我在MyObject类而不是DTO级别寻找序列化解决方案,否则我不仅要将解决方案应用于DTO,还要将其他DTO应用于引用MyObject的所有其他DTO。

更新

以下答案在一个位置解决了这个问题,但在以下场景中仍然存在问题;

public class DTO2 {
     @JsonUnwrapped
     public MyObjectAbstract json2;
}

MyObject是MyObjectAbstract的扩展,当DTO2 MyObjectAbstract是MyObject的一个实例时,我喜欢将DTO2简单地序列化为:

{
    "key": "value"
}

问题在于,每当DTO2.MyObjectAbstract是MyObject的一个实例时,它都被序列化为:

{
    "json": {
        "key": "value"
    }
}

1 个答案:

答案 0 :(得分:1)

您可以在getter方法上使用JsonRawValueJsonValue注释。这是一个例子:

public class JacksonUnwrapped {

    static class MyObject {
        private String rawJson;

        MyObject(final String rawJson) {
            this.rawJson = rawJson;
        }

        @JsonRawValue
        @JsonValue
        String getRawJson() {
            return rawJson;
        }
    }

    static class DTO {
        public MyObject json;

        DTO(final MyObject json) {
            this.json = json;
        }
    }

    public static void main(String[] args) throws JsonProcessingException {
        final ObjectMapper objectMapper = new ObjectMapper();
        final DTO dto = new DTO(new MyObject(
                "{\"key\": \"value\"}"));
        System.out.println(objectMapper
                .writerWithDefaultPrettyPrinter()
                .writeValueAsString(dto));
    }

}

输出:

{
  "json" : {"key": "value"}
}