Java GSON заменить значение пароля при сериализации - PullRequest
1 голос
/ 30 января 2012

Как я могу заменить значение поля пароля на XXX при десериализации объекта с помощью Gson? Я нашел этот пост: Gson: Как исключить определенные поля из сериализации без аннотаций , которые в основном пропускают поле. Это было бы вариантом, но я все же предпочел бы заменить значение на XXX

Я тоже пробовал это:

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 для «регистрации» некоторых объектов «довольно», поэтому мне не нужно беспокоиться о форматировании при чтении журналов.

Ответы [ 2 ]

3 голосов
/ 30 июля 2013

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

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;
}
2 голосов
/ 30 января 2012

Я чувствую себя довольно хромым, когда публикую этот ответ. Но это то, что вы можете, это по существу копирует и изменяет объект 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"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...