我有一个包含大量整数字段的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)
小智 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)
你可以写一个自定义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.