Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gson toJson(), weird behavior (produce empty json)

I have problems serializing / deserializing this class with 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); }
}

If I run this:

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

It prints:

Test: {}

But if I run this:

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

It works as expected and prints:

Test: {"id":"1465988493"}

Test id: 1465988493

So calling the getter AFTER calling toJson made toJson() to work. WTF???

Last thing, if I initialize the id to 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); }
}

Then everything works as expected, and this code:

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

Prints:

Test: {"id":"1465988493"}

So, I have the solution (initialize all my fields to null), but I'd like to understand what's wrong??

like image 229
Tim Autin Avatar asked Jun 16 '16 14:06

Tim Autin


People also ask

What does GSON toJson do?

Introduction. Gson is the main actor class of Google Gson library. It provides functionalities to convert Java objects to matching JSON constructs and vice versa. Gson is first constructed using GsonBuilder and then toJson(Object) or fromJson(String, Class) methods are used to read/write JSON constructs.

How to exclude field in Gson?

ExclusionStrategy strategy = new ExclusionStrategy() { @Override public boolean shouldSkipClass(Class<?> clazz) { return false; } @Override public boolean shouldSkipField(FieldAttributes field) { return field. getAnnotation(Exclude. class) !=

What is difference between fromJson and toJson?

Differences between fromJson() and toJson() methods of Gson in Java? A Gson is a library for java and it can be used to generate a JSON. We can use the fromJson() method of Gson to parse JSON string into java object and use the toJson() method of Gson to convert Java objects into JSON string.


Video Answer


1 Answers

There is just proguard problem. If you use proguard just keep in mind the proguard can remove some fields from class if you don't use it. For example your app doesn't use getters of class. So easy way just add annotation to keep it like:

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

Or add keep rule to your proguard file.

like image 77
Djek-Grif Avatar answered Sep 24 '22 13:09

Djek-Grif