2012-01-30 10 views
1

パスワードフィールドの値をXXXに置き換えるには、どうすればGsonでオブジェクトを逆シリアル化することができますか?私はこの投稿を見つけた:Gson: How to exclude specific fields from Serialization without annotationsは、基本的にフィールドをスキップします。これはオプションになりますが、私はまだ私もこれを試してみましたXXXjava gsonシリアライズ中にパスワード値を置き換えます

で値を置き換えることを好むだろう:

GsonBuilder builder = new GsonBuilder().setPrettyPrinting(); 
builder.registerTypeAdapter(String.class, new JsonSerializer<String>(){ 

    @Override public JsonElement serialize(String value, Type arg1, JsonSerializationContext arg2){ 
     // could not find a way to determine the field name  
     return new JsonPrimitive(value); 
    } 
}); 

残念ながら、私は、フィールドの名前を決定することができませんでした。他の選択肢はありますか?

私はGsonを使っていくつかのオブジェクトを「きれいな」方法でログしていますので、ログを読んでいる間に書式を気にする必要はありません。

+1

は、Javaを変換しながら、パスワードをマスクしますJSONへのオブジェクト。またはその逆? – Nishant

+0

シリアライズ時にパスワードを隠したいと思う可能性が高いのは、そのときにパスワードが漏洩する可能性があるからです。 –

+0

ちょっと@Nishant、はい、私は方向java => json(文字列)の情報をログに記録できるパスワードをマスクしたいと思います。ありがとうございました。コン – kon

答えて

2

この回答を投稿している間、私はかなり不自由を感じます。しかし、それはあなたができることです、それは本質的に、シリアル化する前に、Javaオブジェクトをコピーし、変更します。あなただけの通常それをシリアル化し、パスワードを置き換え、クローニング工程を省略することができます

{"name":"naishe","password":"xxxxxx"} 
3

public class User { 
    private static final Gson gson = new Gson(); 
    public String name; 
    public String password; 

    public User(String name, String pwd){ 
     this.name = name; 
     this.password = pwd; 
    } 

    @Override 
    protected Object clone() throws CloneNotSupportedException { 
     return new User(this.name, this.password); 
    } 

    public static void main(String[] aa){ 
     JsonSerializer<User> ser = new JsonSerializer<User>() { 
      @Override 
      public JsonElement serialize(User u, Type t, JsonSerializationContext ctx) { 
       try { 
        User clone = (User)u.clone(); 
        clone.password = clone.password.replaceAll(".","x"); 
        return (gson.toJsonTree(clone, User.class)); 
       } catch (CloneNotSupportedException e) { 
        //do something if you dont liek clone. 
       } 
       return gson.toJsonTree(u, User.class); 
      } 
     }; 
     Gson g = new GsonBuilder().registerTypeAdapter(User.class, ser).create(); 
     System.out.println(g.toJson(new User("naishe", "S3cr37"))); 
    } 
} 

はにシリアライズ取得し

public JsonElement serialize(User u, Type t, JsonSerializationContext ctx) { 
      JsonObject obj = new Gson().toJsonTree(u).getAsJsonObject(); 
      obj.remove("password"); 
      obj.add("password", new JsonPrimitive("xxxxx"); 
      return obj; 
} 
関連する問題