6

我在使用 Gson 序列化/反序列化此类时遇到问题:

public class Test {

    @SerializedName("id")
    private String mId;

    public String getId() { return mId; }

    public static Test fromJson(String json) { return new Gson().fromJson(json, Test.class); }
    public String toJson() { return new Gson().toJson(this, Test.class); }
}

如果我运行这个:

Test test = Test.fromJson("{\"id\":\"1465988493\"}");
Log.i(TAG, "Test: " + test.toJson());
//Log.i(TAG, "Test id: " + test.getId());

它打印:

测试: {}

但是如果我运行这个:

Test test = Test.fromJson("{\"id\":\"1465988493\"}");
Log.i(TAG, "Test: " + test.toJson());
Log.i(TAG, "Test id: " + test.getId());

它按预期工作并打印:

测试:{"id":"1465988493"}

测试编号:1465988493

所以在调用 toJson 之后调用 getter 会使 toJson() 工作。怎么回事???

最后一件事,如果我将 id 初始化为 null:

public class Test {

    @SerializedName("id")
    private String mId = null; // <- Init to null

    public String getId() { return mId; }

    public static Test fromJson(String json) { return new Gson().fromJson(json, Test.class); }
    public String toJson() { return new Gson().toJson(this, Test.class); }
}

然后一切都按预期工作,这段代码:

String testJson = "{\"id\":\"1465988493\"}";
Test test = Test.fromJson(testJson);
Log.i(TAG, "Test: " + test.toJson());
//Log.i(TAG, "Test id: " + test.getId());

印刷:

测试:{"id":"1465988493"}

所以,我有解决方案(将我的所有字段初始化为空),但我想了解有什么问题?

4

1 回答 1

4

只是proguard问题。如果您使用 proguard,请记住,如果您不使用 proguard,它可以从类中删除一些字段。例如,您的应用程序不使用类吸气剂。如此简单的方法只需添加注释以使其保持不变:

@SerializedName("id")
@Keep
private String mId;

或者将保留规则添加到您的 proguard 文件中。

于 2019-04-30T16:01:41.223 回答