2017-10-06 106 views
0

我有一個很大的嵌套對象。我想在JSON字符串中序列化這個對象,但是我只需要包含某些字段。這裏的問題是這些字段可能會非常頻繁地更改,我想以一種可以幫助我輕鬆包含或排除字段進行序列化的方式來構建它。將對象序列化爲json,僅限某些字段

我知道我可以編寫很多代碼來提取某些字段並「手動」構建JSON。但我想知道是否有其他優雅的方式來達到類似的結果,但指定了必填字段的列表?

例如具有以下的對象結構欲僅包括id並在響應name

class Building { 
    private List<Flat> flats; 
} 

class Flat { 
    private Integer id;  
    private Person owner; 
} 


class Person { 
    private String name; 
    private String surname; 
} 

JSON:

{ 
    "flats" : [ 
     { 
      "flat": 
      { 
       "id" : "1", 
       "person" : { 
        "name" : "John" 
       } 
      } 
     } 
    ] 
} 

回答

1

可以使用gson用於序列化/反序列化JSON。 然後,您可以包含@Expose註釋以僅使用您需要的字段。

一定還要配置您的Gson對象以僅序列化「暴露」字段。

Gson gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 

備選:

實際上,你可以做到這一點的逆方式,標誌着該領域不會暴露。您可以使用transient關鍵字執行此操作。 所以無論你想忽略,只需添加transient它。以下是gson的工作原理。

PS:這也適用於大部分Java JSON串行器。

+0

聽起來不錯,我會努力的!如果我將整個私人所有者字段標記爲@Expose,它是否也會自動包含所有嵌套字段? –

+0

實際上,如果你想讓它們串行化,你必須用'@ Expose'註釋標記所有字段。我用另一種方式編輯答案,也讀了,也許這更適合你。 – torque203

0

使用com.fasterxml.jackson.annotation.JsonIgnore是實現此目的的另一種方法。

import com.fasterxml.jackson.annotation.JsonIgnore; 

class Person { 
    private String name; 
    @JsonIgnore 
    private String surname; 
} 

當解析器將bean轉換爲json時,它將忽略surname。 其他json處理庫中將提供類似的註釋。

0

如果使用Gson,請學習如何使用ExclusionStrategy & JsonSerializer。

使用這些是一種更靈活的方式來控制序列化,因爲它允許決定每個序列化序列化。

如果需要更改要序列化的內容,使用註釋稍後需要在字段中添加/刪除這些註釋。

在你的例子中,後者可能更合適。

這個問題可能是很好的起始點 serialize-java-object-with-gson