Java 如何配置gson以排除0个整数值
我有一个Java类,有很多整型字段,当我想将它们序列化为json字符串时,因为其中一些字段可能没有值,因此在序列化之后,所有整型都会得到零作为值!如果它们没有任何值,我想将gson配置为不序列化它们 例如,我有一门课:Java 如何配置gson以排除0个整数值,java,android,Java,Android,我有一个Java类,有很多整型字段,当我想将它们序列化为json字符串时,因为其中一些字段可能没有值,因此在序列化之后,所有整型都会得到零作为值!如果它们没有任何值,我想将gson配置为不序列化它们 例如,我有一门课: class Example { String title = "something"; int id = 22; int userId; } 默认情况下,gson为我提供以下结果: { "title" : "something", "id" :
class Example {
String title = "something";
int id = 22;
int userId;
}
默认情况下,gson为我提供以下结果:
{
"title" : "something",
"id" : 22,
"userId" : 0
}
但是我不想在userId的值为0时序列化它。因此json应该是:
{
"title" : "something",
"id" : 22
}
对于默认情况下不序列化空对象的对象,是否有方法将gson配置为不序列化0个数字您可以编写自定义的
类型适配器
public class ExampleTypeAdapter extends TypeAdapter<Example> {
@Override
public Example read(com.google.gson.stream.JsonReader in)
throws IOException {
final Example example = new Example();
in.beginObject();
while (in.hasNext()) {
String name = in.nextName();
if ("title".equals(name)) {
example.title = in.nextString();
} else if ("id".equals(name)) {
example.id = in.nextInt();
} else if ("userId".equals(name)) {
example.userId = in.nextInt();
}
}
in.endObject();
return example;
}
@Override
public void write(com.google.gson.stream.JsonWriter out, Example example)
throws IOException {
out.beginObject();
out.name("title").value(example.title);
if(example.id != 0) {
out.name("id").value(example.id);
}
if(example.userId != 0) {
out.name("userId").value(example.userId);
}
out.endObject();
}
}
输出将是:
{
"title": "my title",
"id": 1234
}
注意:重要部分是我们定制的
类型适配器的write
方法
我们只需使用classInteger
()
public class ExampleTypeAdapter extends TypeAdapter<Example> {
@Override
public Example read(com.google.gson.stream.JsonReader in)
throws IOException {
final Example example = new Example();
in.beginObject();
while (in.hasNext()) {
String name = in.nextName();
if ("title".equals(name)) {
example.title = in.nextString();
} else if ("id".equals(name)) {
example.id = in.nextInt();
} else if ("userId".equals(name)) {
example.userId = in.nextInt();
}
}
in.endObject();
return example;
}
@Override
public void write(com.google.gson.stream.JsonWriter out, Example example)
throws IOException {
out.beginObject();
out.name("title").value(example.title);
if(example.id != 0) {
out.name("id").value(example.id);
}
if(example.userId != 0) {
out.name("userId").value(example.userId);
}
out.endObject();
}
}
创建这个JSON类型适配器。它可以用于任何您想要忽略写入零值的地方。它还可以适应长、双精度和其他数字类型。也可以将其更改为忽略写入除零以外的值 是的,我知道自动装箱和取消装箱是隐式使用的,但不能为泛型类型指定基元类型
public class IntIgnoreZeroAdapter extends TypeAdapter<Integer> {
private static Integer INT_ZERO = Integer.valueOf(0);
@Override
public Integer read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return 0;
}
return in.nextInt();
}
@Override
public void write(JsonWriter out, Integer data) throws IOException {
if (data == null || data.equals(INT_ZERO)) {
out.nullValue();
return;
}
out.value(data.intValue());
}
}
如果它们没有任何值,我想将gson配置为不序列化它们
这句话让我相信您误解了变量和值在Java中的工作方式。请注意,Java中的所有变量都有一个值,即使您没有显式地为它们赋值。如果您声明了一个int
而没有为其赋值,则会为您指定一个默认值0
。因此:
int userId;
相当于:
int userId = 0;
尽管尼廷·加万德的答案本身并不正确,但我还是推荐它,因为我认为这可能是你想要的。
整数的null
值比int
的零值(通常)更可靠地表示从未赋值的值。它还允许您使用GSON便捷的“不序列化空值”功能。回答得很好!非常感谢。这可能是重复的,这并不是问题所要求的。在本例中,您已将0替换为null,并利用了GSON的“不序列化null”功能。如果要双值忽略?比为整个对象类编写TypeAdapters更灵活、更易于实现。这是很久以前的事了,我不记得最后使用了什么,但要点是,我不希望值为0的int被序列化
int userId;
int userId = 0;