Java 使用GSON避免json映射中的原始数据类型默认值

Java 使用GSON避免json映射中的原始数据类型默认值,java,json,reflection,gson,Java,Json,Reflection,Gson,通过使用上面的类结构,我使用Gson库生成json,它工作得非常好,但问题是我想要避免原始数据类型默认值到json映射 public class Test { public int num; public String name; public String email; public Test(){ } public int getNum() { return num; } public void set

通过使用上面的类结构,我使用Gson库生成json,它工作得非常好,但问题是我想要避免原始数据类型默认值到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;
    }

}
//输出json

Test obj=new Test();
obj.setEmail("abc@abc.com");
obj.setName("Mike");
String json= new Gson().toJson(obj);
 Test obj=new Test();
 obj.setName("Mike");
 String json= new Gson().toJson(obj);
在输出json num是assign 0,这是原始数据类型int的默认值,我希望在json映射中避免int的默认原始数据类型。 我希望行为类似于引用类型。如果我不为name或email赋值,它将不会在输出json中生成

{"num":0,"name":"Mike","email":"abc@abc.com"}
//输出json

Test obj=new Test();
obj.setEmail("abc@abc.com");
obj.setName("Mike");
String json= new Gson().toJson(obj);
 Test obj=new Test();
 obj.setName("Mike");
 String json= new Gson().toJson(obj);
如何避免输出json中的原语默认值


任何帮助都将不胜感激

改用这段代码,这里我将int改为Integer,并封装了实例变量

 {"num":0,"name":"Mike"}

改用这段代码,这里我将int改为Integer,并封装了实例变量

 {"num":0,"name":"Mike"}

改用这段代码,这里我将int改为Integer,并封装了实例变量

 {"num":0,"name":"Mike"}

改用这段代码,这里我将int改为Integer,并封装了实例变量

 {"num":0,"name":"Mike"}

如果字段必须是基本字段,或者如果要从外部库中的类序列化对象,则可以使用(因此不能将其更改为包装类)排除策略。在您指定的情况下,这看起来像:

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(){
@凌驾
公共布尔值shouldSkipField(字段属性f){
如果(f.getDeclaringClass()==Test.class&&f.getName().equals(“num”)){
返回true;
}
返回false;
}
@凌驾
公共布尔shouldSkipClass(类clazz){
返回false;
}
})
您可以在此处检查从序列化中排除字段的其他方法:

如果字段必须是基本字段,或者如果要从外部库中的类序列化对象,则可以使用(因此不能将其更改为包装类)排除策略。在您指定的情况下,这看起来像:

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(){
@凌驾
公共布尔值shouldSkipField(字段属性f){
如果(f.getDeclaringClass()==Test.class&&f.getName().equals(“num”)){
返回true;
}
返回false;
}
@凌驾
公共布尔shouldSkipClass(类clazz){
返回false;
}
})
您可以在此处检查从序列化中排除字段的其他方法:

如果字段必须是基本字段,或者如果要从外部库中的类序列化对象,则可以使用(因此不能将其更改为包装类)排除策略。在您指定的情况下,这看起来像:

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(){
@凌驾
公共布尔值shouldSkipField(字段属性f){
如果(f.getDeclaringClass()==Test.class&&f.getName().equals(“num”)){
返回true;
}
返回false;
}
@凌驾
公共布尔shouldSkipClass(类clazz){
返回false;
}
})
您可以在此处检查从序列化中排除字段的其他方法:

如果字段必须是基本字段,或者如果要从外部库中的类序列化对象,则可以使用(因此不能将其更改为包装类)排除策略。在您指定的情况下,这看起来像:

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(){
@凌驾
公共布尔值shouldSkipField(字段属性f){
如果(f.getDeclaringClass()==Test.class&&f.getName().equals(“num”)){
返回true;
}
返回false;
}
@凌驾
公共布尔shouldSkipClass(类clazz){
返回false;
}
})
您可以在此处检查从序列化中排除字段的其他方法:

从Google GSON库中可以看出,它不支持原始数据类型的类型适配器。但是从它开始;因此,您可以为基本类型编写自定义类型适配器

我使用的是迄今为止最新的谷歌GSON库版本2.8.5。我正在为我的一个Android应用程序编写一个自定义反序列化程序,其中在我的应用程序的较新API中引入的一些字段有空值,字段类型为数字(整数/浮点/双精度),GSON抛出异常消息“java.lang.NumberFormatException for empty String”。我可以用下面的代码片段来处理它:

Test.java

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;
                }
})
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”:“johndoe”,“email”:“John”。doe@example.com“}
解析失败,代码
新建GsonBuilder().create().fromJson(jsonString,Test.class)
。但是,为基元类型编写自定义类型适配器在这里发挥了神奇的作用

IntegerDeserializer.java

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;
                }
})
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
}
注意:此处
jsonString
是保存序列化json的变量。

来自Google GSON库的,它不支持原始数据类型的类型适配器。但是从它开始;因此,您可以为基本类型编写自定义类型适配器

我使用的是迄今为止最新的谷歌GSON库版本2.8.5。我正在为我的一个Android应用程序编写一个自定义反序列化程序,其中