Java Gson исключает поля во время сериализации

у меня есть ConfigInstance класс, который содержит password и password_hash. Теперь я хочу сериализовать объект с помощью gson, но исключить

8 ответов


чтобы получить этот результат, вам нужно аннотировать все поля с помощью @Expose:

public class ConfigInstance {

    @Expose
    public String database_address;
    @Expose
    public int database_port;
    @Expose
    public String database_user;

    @Expose(serialize = false)
    private String database_pass;
    @Expose
    public String database_pass_hash;

и настройте Gson только для предоставления полей, которые аннотированы и игнорируют остальные, как показано в следующем:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create();

тогда, вы получите:

{
  "database_address": "127.0.0.1",
  "database_port": 1521,
  "database_user": "test",
  "database_pass_hash": "B9FE2C011B59F0D0D383D70073E48A19"
}

кроме того, когда deserialising строку, которую вы по-прежнему будете иметь, а также атрибут пароля.


тем не менее, у вас есть возможность настроить Сериализатор Gson для добиться этого.


Если вам нравится, что конкретное поле не сериализуется, дайте ему переходное ключевое слово

private transient String database_pass;

посетить https://sites.google.com/site/gson/gson-user-guide#TOC-Finer-Points-with-Objects дополнительные сведения


Это другой способ.

Gson gson = new GsonBuilder()
            .addDeserializationExclusionStrategy(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    return f.getName().toLowerCase().contains("fieldName");
                }

                @Override
                public boolean shouldSkipClass(Class<?> aClass) {
                    return false;
                }
            })
            .create();

@utkusonmez Этот ответ работает, хотя упомянутый метод неверен. Он должен использовать "addSerializationExclusionStrategy" вместо "addDeserializationExclusionStrategy"

таким образом, ответ будет выглядеть как

Gson gson = new GsonBuilder()
            .addSerializationExclusionStrategy(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    return f.getName().toLowerCase().contains("fieldName");
                }

                @Override
                public boolean shouldSkipClass(Class<?> aClass) {
                    return false;
                }
            })
            .create();

gson.toJson(*OBJ_TO_SERIALIZE*))

Если вы хотите отключить только сериализацию или только десериализацию, вы можете играть с @Expose атрибуты аннотации, например:

@Expose(serialize = false, deserialize = true)

опция по умолчанию true, поэтому десериализация здесь не нужна.


Вы можете сделать трюк с этого:

Gson gson = new GsonBuilder()
            .excludeFieldsWithModifiers(Modifier.STATIC)
            .create();

затем во всех полях, которые вы хотите выделить из объекта, просто добавьте модификатор "static"

@Expose(serialize = false)
private static String database_pass;

Вы можете использовать Transient модификатор или что-то вам подходит


это поздний ответ, но это может помочь кому-то.

вам нужно только сделать @Expose(serialize = false, deserialize = false) или просто то, что вы хотите.

если у вас serialize и deserialize true его не nesseccary, чтобы иметь @Expose на всех.

создать этот класс:

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

public class NoModuleExclusionStrategy implements ExclusionStrategy {

    private final boolean deserialize;

    public NoModuleExclusionStrategy(boolean isdeserialize) {
        deserialize = isdeserialize;
    }

    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        return false;
    }

    @Override
    public boolean shouldSkipField(FieldAttributes field) {
        return !(field.getAnnotation(Expose.class) == null || (deserialize ? field.getAnnotation(Expose.class).deserialize() : field.getAnnotation(Expose.class).serialize()));
    }

}

а затем построить Gson с GsonBuilder

Gson gson = new GsonBuilder()
.addSerializationExclusionStrategy(new NoModuleExclusionStrategy(false))
.addDeserializationExclusionStrategy(new NoModuleExclusionStrategy(true))
.create();

ваш класс ConfigInstance будет выглядеть следующим образом

{
  "database_address": "127.0.0.1",
  "database_port": 1521,
  "database_user": "test",
  "database_pass_hash": "B9FE2C011B59F0D0D383D70073E48A19"
}

вот очень простое решение с одной строкой кода, без аннотации @Expose или стратегии исключения.

поведение по умолчанию, которое реализовано в Gson, это поля нулевого объекта игнорируются. Таким образом, все, что вам нужно сделать, это установить поле пароля в null перед сериализацией.

map.setPassword(null); // or map.password = null;
String jsonConfig = gson.toJson(map); // This won't serialize null password field