2017-12-23 21 views
3

私は複数のフィールドを持つオブジェクトのリストを持っています。 API呼び出しに基づいて、リストは特定のフィールドのセットのみで返されます。私は一時的な使用 - それは特定のフィールドをシリアル化しません。しかし、そのフィールドは別のAPI呼び出しのために返す必要があります。私はGsonを使用しています。GSONを使用してJSONにシリアル化するPOJOフィールドを設定する方法を教えてください。

次の例では、APIに基づいて、表インスタンスのリストを、たとえばテーブルインスタンスの "name"、または "name"と "location"の両方、または単に場所。テーブルオブジェクトには30個のフィールドがあります。

1つの方法は、シナリオごとにPOJOにマップして印刷することです。これを行うより良い方法はありますか?どのフィールドをシリアル化するかを選択/選択/制約することができます。

など。

package Testing; 

import java.util.ArrayList; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 

public class TestJson { 

    public static Gson obGson = new GsonBuilder().setPrettyPrinting().create(); 

    public static void main(String[] args) { 

     ArrayList<Table> myTable = new ArrayList<Table>(); 

     myTable.add(new Table("John", "Chicago")); 
     myTable.add(new Table("David", "Seattle")); 
     myTable.add(new Table("June", "Dallas")); 

     System.out.println(obGson.toJson(myTable)); 

    } 

} 

class Table { 

    String name; 
    String location; 

    public Table (String _name, String _location) { 

     name  = _name; 
     location = _location; 

    } 
} 

上記の出力は、次のようになります。 API-1が呼び出されると、出力は以下のようになります。

[ 
    { 
    "name": "John", 
    "location": "Chicago" 
    }, 
    { 
    "name": "David", 
    "location": "Seattle" 
    }, 
    { 
    "name": "June", 
    "location": "Dallas" 
    } 
] 

しかし、API-2が呼び出されると、出力は以下のようになります。そのAPI呼び出しで承認されたフィールドのみを返します。

[ 
    { 
    "name": "John" 
    }, 
    { 
    "name": "David" 
    }, 
    { 
    "name": "June" 
    } 
] 

同様に、API呼び出しに基づいてリターンを管理することもできます。

+0

問題は何ですか?あなたがシリアル化したい場合、Gsonは宣言されたフィールドを必要としますが、テーブルPOJOは必ずしも必要ではありません。直接マップにシリアル化してから、必要なフィールドを取得することができます –

+0

'しかし、そのフィールドは別のAPI呼び出しのために返されます.'それはどういう意味ですか?あなたは見たい出力の例を挙げることができますか? – markspace

+0

@markspace、お返事ありがとうございます。私は例を挙げました。どのフィールドを返すかを管理する方法を探していました。状況を説明するのに役立つことを願っています。 – userDSSR

答えて

3

@Test 
public void testShouldSkipField() { 

    Gson gson;  
    Table table = new Table(); 

    Collection<String> serializedFields = new ArrayList<>(); 

    ArrayList<Table> myTable = new ArrayList<Table>(); 
    myTable.add(new Table("John", "Chicago")); 
    myTable.add(new Table("David", "Seattle")); 
    myTable.add(new Table("June", "Dallas")); 

    serializedFields.add("name"); 
    gson = new GsonBuilder() 
     .setPrettyPrinting() 
     .addSerializationExclusionStrategy(
       new FieldExclusionStrategy(serializedFields)) 
     .create(); 
    log.info("\n{}", gson.toJson(myTable));  

    serializedFields.add("location");  
    gson = new GsonBuilder() 
     .setPrettyPrinting() 
     .addSerializationExclusionStrategy(
       new FieldExclusionStrategy(serializedFields)) 
     .create(); 
    log.error("\n{}", gson.toJson(myTable));  

    serializedFields.remove("name");  
    gson = new GsonBuilder() 
     .setPrettyPrinting() 
     .addSerializationExclusionStrategy(
       new FieldExclusionStrategy(serializedFields)) 
     .create(); 
    log.error("\n{}", gson.toJson(myTable));  

} 

上記のようなExclusionStrategy

@RequiredArgsConstructor 
public class FieldExclusionStrategy implements ExclusionStrategy { 

    @NonNull 
    private final Collection<String> serializedFields; 

    @Override 
    public boolean shouldSkipField(FieldAttributes f) { 
     if(serializedFields.contains(f.getName())) return false; 
     return true; 
    } 

    @Override 
    public boolean shouldSkipClass(Class<?> clazz) { return false; } 

} 

などの使用が

2017年12月23日19のようなものでしょうログの実装:47:17.028 INFO org.example.gsonを.FieldExclusionStrategyTest:37 -
[
      {
            "名前": "ジョン"
     }、
      {
            "名前": "デービッド"
     }、
      {
            "名前": "6月"
     }
]
2017年12月23日19:47:17.034エラーorg.example。 gson。FieldExclusionStrategyTest:44から
[
      {
            "名前": "ジョン"、
            "場所": "シカゴ"
     } 、
      {
            "名前": "デービッド"、
            "場所": "シアトル"
     }、
      {
            "名": "6月"、
            "場所": "ダラス"
     }
]
2017年12月23日19:47:17.035エラーorg.example。 gson.FieldExclusionStrategyTest:51から
[
      {
            "場所": "シカゴ"
     }、
      {
            "場所": "シアトル"
     }、
      {
            "場所": "ダラス"
     }
]

あなたはシリアル化されたフィールド名のリストを変更した後、再びGSONを構築する必要があります。

GSON内部的に結果をキャッシュする - true | false - フィールド名の最初の呼び出し時に、キャッシュされたフィールド名に対して再度クエリを実行しません。

そして、あなたはその後、 ExclusionStrategyを登録 GsonBuilder(またはそれらの多く)で GSONを構築する必要があり ExclusionStrategy追加します。

も参照してください。このトピックについては、my questionを参照してください。

+0

「GSONをもう一度ビルドする必要がある」と言うと、変数 'gson'を意味していますか? '新しいGsonBuilder()'への呼び出しがどのフィールドをシリアル化するかを変更する必要があることを単に強調していますか? – markspace

+0

@markspaceアンサーで更新をチェック – pirho

関連する問題