使用 GSON 避免 json 映射中的原始数据类型默认值
Avoid primitive data types default value in json mapping using GSON
public class Test {
public int num;
public String name;
public String email;
public Test(){
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
通过使用上面的 class 结构,我使用 Gson 库生成 json,它工作得很好,但问题是我想避免原始数据类型的默认值为 json mapping.for例子
Test obj=new Test();
obj.setEmail("abc@abc.com");
obj.setName("Mike");
String json= new Gson().toJson(obj);
//输出json
{"num":0,"name":"Mike","email":"abc@abc.com"}
在输出中 json num 被赋值为 0,这是原始数据类型 int 的默认值,我想避免 json 映射中 int 的默认原始数据类型。
我想要类似于参考 types.if 的行为,我不会为名称或电子邮件分配值,它不会在输出 json.
中生成
Test obj=new Test();
obj.setName("Mike");
String json= new Gson().toJson(obj);
//输出json
{"num":0,"name":"Mike"}
如何避免输出中的原始默认值json?
任何帮助将不胜感激。
改用这段代码,这里我把int改成了Integer,还封装了实例变量
private Integer num;
private String name;
private String email;
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
如果您的字段必须是原始字段,或者如果您要从外部库中的 class 序列化一个对象,您可以使用(因此您不能将其更改为包装器 class) 排除策略。在您指定的情况下,它看起来像:
Gson gson = new GsonBuilder().addSerializationExclusionStrategy(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
if (f.getDeclaringClass() == Test.class && f.getName().equals("num")) {
return true;
}
return false;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
})
您可以在此处查看从序列化中排除字段的其他方法:
https://www.baeldung.com/gson-exclude-fields-serialization#highlighter_288459
从 old release docs of Google GSON library it did not supported the type adapter for primitive data type. But from the release document 开始;因此,您可以为原始类型编写自定义类型适配器。
我使用的是最新的 Google GSON 库版本 2.8.5。我正在为我的 Android 应用程序之一编写自定义反序列化程序,其中一些字段的值为空,这些字段是在我的应用程序的较新 API 中引入的,并且字段类型是数字(整数/浮点数/双精度), GSON 抛出异常消息“java.lang.NumberFormatException for empty String”。我能够使用以下代码片段处理它:
Test.java
import com.google.gson.annotations.SerializedName;
public class Test {
@SerializedName("num")
public int num;
@SerializedName("name")
public String name;
@SerializedName("email")
public String email;
//getters and setters
}
对于示例 JSON {"num": "", "name": "John Doe", "email":"john.doe@example.com"}
解析失败,代码为 new GsonBuilder().create().fromJson(jsonString, Test.class)
。但是为基本类型编写自定义类型适配器在这里起到了神奇的作用。
IntegerDeserializer.java
public class IntegerDeserializer implements JsonDeserializer<Integer> {
@Override
public Integer deserialize(JsonElement json, Type typeOfSrc, JsonDeserializationContext context) throws JsonParseException {
String value = json.getAsJsonPrimitive().getAsString();
try {
return Integer.parseInt(value);
} catch (Exception ex) {
return 0;
}
}
}
现在将适配器用作:
new GsonBuilder()
.registerTypeAdapter(int.class, new IntegerDeserializer())
.create()
.fromJson(jsonString, Test.class)
注:这里jsonString
是持有序列化后的变量json。
public class Test {
public int num;
public String name;
public String email;
public Test(){
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
通过使用上面的 class 结构,我使用 Gson 库生成 json,它工作得很好,但问题是我想避免原始数据类型的默认值为 json mapping.for例子
Test obj=new Test();
obj.setEmail("abc@abc.com");
obj.setName("Mike");
String json= new Gson().toJson(obj);
//输出json
{"num":0,"name":"Mike","email":"abc@abc.com"}
在输出中 json num 被赋值为 0,这是原始数据类型 int 的默认值,我想避免 json 映射中 int 的默认原始数据类型。 我想要类似于参考 types.if 的行为,我不会为名称或电子邮件分配值,它不会在输出 json.
中生成 Test obj=new Test();
obj.setName("Mike");
String json= new Gson().toJson(obj);
//输出json
{"num":0,"name":"Mike"}
如何避免输出中的原始默认值json?
任何帮助将不胜感激。
改用这段代码,这里我把int改成了Integer,还封装了实例变量
private Integer num;
private String name;
private String email;
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
如果您的字段必须是原始字段,或者如果您要从外部库中的 class 序列化一个对象,您可以使用(因此您不能将其更改为包装器 class) 排除策略。在您指定的情况下,它看起来像:
Gson gson = new GsonBuilder().addSerializationExclusionStrategy(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
if (f.getDeclaringClass() == Test.class && f.getName().equals("num")) {
return true;
}
return false;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
})
您可以在此处查看从序列化中排除字段的其他方法: https://www.baeldung.com/gson-exclude-fields-serialization#highlighter_288459
从 old release docs of Google GSON library it did not supported the type adapter for primitive data type. But from the release document 开始;因此,您可以为原始类型编写自定义类型适配器。
我使用的是最新的 Google GSON 库版本 2.8.5。我正在为我的 Android 应用程序之一编写自定义反序列化程序,其中一些字段的值为空,这些字段是在我的应用程序的较新 API 中引入的,并且字段类型是数字(整数/浮点数/双精度), GSON 抛出异常消息“java.lang.NumberFormatException for empty String”。我能够使用以下代码片段处理它:
Test.java
import com.google.gson.annotations.SerializedName;
public class Test {
@SerializedName("num")
public int num;
@SerializedName("name")
public String name;
@SerializedName("email")
public String email;
//getters and setters
}
对于示例 JSON {"num": "", "name": "John Doe", "email":"john.doe@example.com"}
解析失败,代码为 new GsonBuilder().create().fromJson(jsonString, Test.class)
。但是为基本类型编写自定义类型适配器在这里起到了神奇的作用。
IntegerDeserializer.java
public class IntegerDeserializer implements JsonDeserializer<Integer> {
@Override
public Integer deserialize(JsonElement json, Type typeOfSrc, JsonDeserializationContext context) throws JsonParseException {
String value = json.getAsJsonPrimitive().getAsString();
try {
return Integer.parseInt(value);
} catch (Exception ex) {
return 0;
}
}
}
现在将适配器用作:
new GsonBuilder()
.registerTypeAdapter(int.class, new IntegerDeserializer())
.create()
.fromJson(jsonString, Test.class)
注:这里jsonString
是持有序列化后的变量json。