2012-01-30 2 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

Эй @ Нишан, да, я хотел бы замаскировать пароль для направления java => json (string), способного регистрировать информацию. Спасибо. Kon – kon

ответ

2

Я чувствую себя довольно хромой при публикации этого ответа. Но, это то, что вы можете, оно по существу копирует и изменяет объект Java, прежде чем сериализовать.

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"))); 
    } 
} 

получает сериализовать в:

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

Вы можете пропустить шаг клонирования, просто сериализовать это нормально, а затем заменить пароль:

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; 
} 
Смежные вопросы