Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何配置gson以排除0个整数值_Java_Android - Fatal编程技术网

Java 如何配置gson以排除0个整数值

Java 如何配置gson以排除0个整数值,java,android,Java,Android,我有一个Java类,有很多整型字段,当我想将它们序列化为json字符串时,因为其中一些字段可能没有值,因此在序列化之后,所有整型都会得到零作为值!如果它们没有任何值,我想将gson配置为不序列化它们 例如,我有一门课: class Example { String title = "something"; int id = 22; int userId; } 默认情况下,gson为我提供以下结果: { "title" : "something", "id" :

我有一个Java类,有很多整型字段,当我想将它们序列化为json字符串时,因为其中一些字段可能没有值,因此在序列化之后,所有整型都会得到零作为值!如果它们没有任何值,我想将gson配置为不序列化它们

例如,我有一门课:

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
方法

我们只需使用class
Integer
()

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;