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