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

EC8*_*4B4 12 java android

我有一个包含大量整数字段的Java类,当我想将它们序列化为json字符串时,由于其中一些字符串可能没有值,因此在序列化后所有整数都为零值!如果他们没有任何值,我想配置gson不要序列化它们.

例如,我有这个类:

class Example {
   String title = "something";
   int id = 22;
   int userId;
} 
Run Code Online (Sandbox Code Playgroud)

默认情况下,gson给我这个结果:

{
   "title" : "something",
   "id" : 22,
   "userId" : 0
}
Run Code Online (Sandbox Code Playgroud)

但我不希望userId在其值为0时被序列化.所以json应该是:

{
   "title" : "something",
   "id" : 22
}
Run Code Online (Sandbox Code Playgroud)

对于对象默认情况下gson不序列化空对象有没有办法配置gson不序列化0号

小智 31

我们必须使用类Integer.

class Example {
   String title = "something";
   Integer id = 22;
   Integer userId;
}
Run Code Online (Sandbox Code Playgroud)

  • 这并不完全是问题所要求的。在此示例中,您将 0 替换为 null,并利用了 GSON 的“不序列化 null”功能。 (2认同)

小智 7

创建此 JSON 类型适配器。它可以用于您想忽略写入零值的任何地方。它还可以适应 Long、Double 和其他数字类型。您还可以更改它以忽略写入零以外的值。

是的,我知道自动装箱和取消装箱是隐式使用的,但您不能为泛型类型指定原始类型。

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

更改您的类,为 int 成员指定 IntIgnoreZeroAdapter。

class Example {
   String title = "something";

   @JsonAdapter(IntIgnoreZeroAdapter.class)
   int id = 22;

   @JsonAdapter(IntIgnoreZeroAdapter.class)
   int userId;
} 
Run Code Online (Sandbox Code Playgroud)


Dev*_*rim 5

你可以写一个自定义TypeAdapter.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试使用以下代码:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Example.class, new ExampleTypeAdapter());
gsonBuilder.setPrettyPrinting();

Gson gson = gsonBuilder.create();

Example example = new Example();
example.title = "mytitle";
example.id = 1234;
example.userId = 0;

final String json = gson.toJson(example);
System.out.println(json);
Run Code Online (Sandbox Code Playgroud)

输出将是:

 {
   "title": "my title",
   "id": 1234
 }
Run Code Online (Sandbox Code Playgroud)

注意:重要的部分是write我们自定义的方法TypeAdapter.