【问题标题】:Java jackson how to unwrap a raw value during serialization?Java杰克逊如何在序列化期间解开原始值?
【发布时间】:2016-10-10 17:47:30
【问题描述】:

在 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,而且应用于引用 MyObject 的所有其他 DTO。

更新:

下面的答案在一个地方解决了这个问题,但在下面的场景中仍然是一个问题;

public class DTO2 {
     @JsonUnwrapped
     public MyObjectAbstract json2;
}

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

{
    "key": "value"
}

问题在于,只要 DTO2.MyObjectAbstract 是 MyObject 的一个实例,它就会像这样被序列化:

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

【问题讨论】:

    标签: java json serialization jackson dto


    【解决方案1】:

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

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

    【讨论】:

    • 这解决了我最终确实想要 {"json" : {"key": "value"}} 的问题,但是如果我有另一个我想要的引用对象 DTO2 怎么办简单地序列化为 {"key": "value"}。我已经用详细信息更新了问题。
    • 依此类推,你可以在DTO2类中添加一个带有JsonValue注解的getter。
    • 是否有不需要对引用该对象的类进行任何更改的解决方案?我担心的是,将来这个类可能会在许多地方被引用,因此无论在何处引用它都需要自定义序列化逻辑并不理想。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    相关资源
    最近更新 更多