2017-10-06 13 views
0

大きな入れ子オブジェクトがあります。 JSON文字列でこのオブジェクトをシリアル化したいのですが、特定のフィールドだけを含める必要があります。ここで問題となるのは、フィールドが頻繁に変更される可能性があるため、シリアル化のフィールドを簡単に含めるか除外するのに役立つ方法で構築したいと考えています。jsonへのオブジェクトのシリアル化、特定のフィールドのみ

私は、特定のフィールドを抽出してJSONを "手動で"構築するためのコードをたくさん書くことができます。しかし、同様の結果を達成するために他のエレガントな方法があるのでしょうか?あなたが/デシリアライズJSONをシリアル化するgsonを使用することができます

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

答えて

1

class Building { 
    private List<Flat> flats; 
} 

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


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

JSON:私が応答でのみidnameを含めたい、次のオブジェクトの構造を有する例えば

。 次に、@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; 
} 

パーサはJSONにBeanを変換するときにはsurnameを無視します。 類似のアノテーションは、他のjson処理ライブラリでも利用できます。

0

Gsonを使用している場合は、ExclusionStrategy & JsonSerializerの使用方法を検討してください。

これらを使用すると、シリアライズごとにシリアライズするものを決めることができるため、シリアライゼーションをより柔軟に制御できます。

注釈を使用すると、後でシリアル化するものを変更する必要がある場合にフィールドからこれらの注釈を追加/削除する必要があります。

例の場合、後者がより適切かもしれません。

この質問は serialize-java-object-with-gson

関連する問題