2016-10-10 65 views
1

在Java中使用的傑克遜JSON庫,是有可能做到以下幾點:rawJson的Java jackson如何在序列化期間打開原始值?

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

} 

public class DTO { 

    public MyObject json; 

} 

例子:

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

回答

0

您可以在一個getter方法inste使用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"} 
} 
+0

這解決了我的問題,在一個情況下我最終還是想{ 「JSON」:{ 「關鍵」: 「值」}},但什麼如果我有另一個引用對象DTO2,我想簡單地序列化爲{「key」:「value」}。我已經用細節更新了這個問題。 –

+0

通過類比,你可以添加一個帶有JsonValue註解的getter到DTO2類。 –

+0

是否有任何解決方案不需要對引用此對象的類進行任何更改?我擔心的是,將來這個類可能會在很多地方被引用,因此不管它在哪裏引用,都不需要定製序列化邏輯。 –