一般的な方法で要件を実装することは、一般的な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"}}