2017-04-24 19 views
1

JSONを渡してJSONを取得するWebサービスを呼び出しています。トラブルシューティングのためにリクエストと応答をログに記録しようとしています。フィールド名の正規表現などで識別されるパスワードの値を除外またはクロスアウト(*を介して)したいと思います。 JSONの解析とシリアライズにGsonを使用しています。私はJsonParserオブジェクト上で私を助ける何も表示されません解析されたJSONからフィールドを除外/削除します

private String toJson(String str) { 
    JsonElement elt = JSON_PARSER.parse(str); 
    return GSON.toJson(elt); 
} 

:私は私のlogRequestlogResponse方法で、次のtoJsonのメソッド呼び出しを含めています。私はのインスタンスをGsonBuilder経由で構築するときは、さまざまな方法を試してみました。このアプローチの難しさは、私がExclusionStrategyを使用できるPOJOにマッピングしていないという事実のようです。私の現在の考えは、再帰的にJsonElementの方法を調べることです。parseメソッドから戻ってきますが、それがうまくいくかどうかはわかりません。

答えて

0

一般的な方法で要件を実装することは、一般的なJSONシリアル化の仕組みによって困難になります。誰かがすでに似たような質問をここにしていた:Jackson: exclude object from serialization based on its properties。 JSON文字列を解析した後にJSONオブジェクトを走査し、パスワードフィールドを特定し、このパスに従うことを望むならば、値を明示的に消滅させてロガーのための文字列に戻すのが良い選択です。

ただし、ログに記録するドキュメントのjsonスキーマがわかっていれば、問題はもっと簡単に解決できます。この状況では、jsonschema2pojo-maven-pluginを使用してスキーマからJava Pojoオブジェクトを生成してから、Gsonライブラリをシリアライゼーション除外戦略に使用することができます。ここでの例である:

String jsonString = "{\"name\":\"parent\",\"id\":\"parentId\",\"password\":\"topsecret\"" + 
      ",\"childPojo\":{\"name\":\"child\",\"id\":\"childId\",\"password\":\"topsecret\"}}"; 

    RegexFieldExclusionStrategy strategy = new RegexFieldExclusionStrategy("pass.*"); 

    Gson gson = new GsonBuilder() 
      .addSerializationExclusionStrategy(strategy) 
      .create(); 

    MyPojo myPojo = gson.fromJson(jsonString, MyPojo.class); 

    String json = gson.toJson(myPojo); 
    System.out.println(json); 

MyPojoクラス:

public class MyPojo { 

    private String name; 
    private String id; 
    private String password; 
    private MyPojo childPojo; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    public String getPassword() { 
     return password; 
    } 
    public void setPassword(String password) { 
     this.password = password; 
    } 
    public MyPojo getChildPojo() { 
     return childPojo; 
    } 
    public void setChildPojo(MyPojo childPojo) { 
     this.childPojo = childPojo; 
    } 
} 

注このPojoマニュアル実装であり、合理化するために、上述したプラグインを使用して、生成されたものと交換することができます全体のプロセス。

RegexFieldExclusionStrategyクラス:

import java.util.regex.Pattern; 

import com.google.gson.ExclusionStrategy; 
import com.google.gson.FieldAttributes; 

public class RegexFieldExclusionStrategy implements ExclusionStrategy { 

    private String regex; 

    public RegexFieldExclusionStrategy(String regex) { 
     Pattern.compile(regex); 
     this.regex = regex; 
    } 

    public boolean shouldSkipClass(Class<?> f) { 
     return false; 
    } 

    public boolean shouldSkipField(FieldAttributes f) { 
     return f.getName().toLowerCase().matches(regex); 
    } 
} 

プログラムが出力以下のJSONドキュメント:

{"name":"parent","id":"parentId","childPojo":{"name":"child","id":"childId"}} 
関連する問題