簡體   English   中英

使用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;
    }

}

通過使用上述類結構,我使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM