[英]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;
}
}
通過使用上述類結構,我使用Gson庫生成了json,該庫工作得很好,但問題是我想避免將原始數據類型的默認值映射到json映射。例如
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的默認原始數據類型。 我想要類似於引用類型的行為。如果我不給名稱或電子郵件賦值,它將不會在輸出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;
}
如果字段必須是原始字段,或者要從外部庫中的類序列化對象,則可以使用(因此不能將其更改為包裝器類)排除策略。 在您指定的情況下,它將類似於:
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
從Google GSON庫的舊發行版文檔來看,它不支持原始數據類型的類型適配器。 但是從發行文檔中可以看到 ; 因此,您可以為原始類型編寫自定義類型適配器。
我正在使用最新的Google GSON庫最新版本2.8.5。 我正在為我的一個Android應用程序編寫一個自定義反序列化器,其中在我的應用程序的較新API中引入了某些字段的空值,並且字段類型為數字(整數/浮點/雙精度),並且GSON拋出異常消息“ java.lang.NumberFormatException為空字符串 ”。 我可以使用下面的代碼片段來處理它:
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的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.