相关疑难解决方法(0)

Gson可选和必填字段

应该如何处理Gson和需要与可选字段?

由于所有字段都是可选的,因此如果响应json包含某个键,我无法真正使网络请求失败,Gson只会将其解析为null.

我正在使用的方法 gson.fromJson(json, mClassOfT);

例如,如果我有以下json:

{"user_id":128591, "user_name":"TestUser"}
Run Code Online (Sandbox Code Playgroud)

而我的班级:

public class User {

    @SerializedName("user_id")
    private String mId;

    @SerializedName("user_name")
    private String mName;

    public String getId() {
        return mId;
    }

    public void setId(String id) {
        mId = id;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        mName = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gson如果json不包含user_iduser_name键,是否有任何选项失败?

在许多情况下,您可能需要至少一些值进行解析,而其他值可以是可选的?

是否有任何模式或库可用于全局处理此案例?

谢谢.

json gson

56
推荐指数
2
解决办法
6万
查看次数

Gson是否必须使用默认的no-args构造函数?

Gson用户指南声明我们应该为任何类定义默认的no-args构造函数以正确使用Gson.更重要的是,在Gson 类的javadoc中,InstanceCreator如果我们尝试反序列化缺少默认构造函数的类的实例,那么将抛出异常,我们应该InstanceCreator在这种情况下使用.但是,我尝试使用缺少默认构造函数的类来测试使用Gson,并且序列化和反序列化工作都没有任何问题.

这是deserializaiton的一段代码.没有非args构造函数的类:

public class Mushroom {
    private String name;
    private double diameter;

    public Mushroom(String name, double diameter) {
        this.name = name;
        this.diameter = diameter;
    }

    //equals(), hashCode(), etc.
}
Run Code Online (Sandbox Code Playgroud)

和测试:

@Test
public void deserializeMushroom() {
    assertEquals(
            new Mushroom("Fly agaric", 4.0),
            new Gson().fromJson(
                    "{name:\"Fly agaric\", diameter:4.0}", Mushroom.class));
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.

所以我的问题是:我是否真的可以使用Gson而不需要默认构造函数,或者在任何情况下它都不起作用?

java json default-constructor gson

51
推荐指数
1
解决办法
2万
查看次数

强制GSON使用特定的构造函数

public class UserAction {
    private final UUID uuid;
    private String userId;
    /* more fields, setters and getters here */

    public UserAction(){
        this.uuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
    }

    public UserAction(UUID uuid){
        this.uuid = uuid;
    }
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final UserAction other = (UserAction) obj;
        if (this.uuid != other.uuid && (this.uuid == null || !this.uuid.equals(other.uuid))) {
            return false;
        }
        return true;
    }

    @Override
    public …
Run Code Online (Sandbox Code Playgroud)

java constructor gson deserialization

20
推荐指数
2
解决办法
1万
查看次数