簡體   English   中英

Java jackson 如何在序列化期間解開原始值?

[英]Java jackson how to unwrap a raw value during serialization?

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

您可以在 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"}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM