Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange "nameValuePairs" key appear when using Gson

I am trying to rebuild an Object from its fields( i get the fields as a JSONObject), something like this:

JSONObject jObj = new JSONObject();  

JSONObject jObj1 = new JSONObject(); 
JSONObject jObj2 = new JSONObject(); 

JSONObject jObj21 = new JSONObject(); 
JSONObject jObj22 = new JSONObject(); 

jObj1.put("jObj11", "value11");
jObj1.put("jObj12", "value12");


jObj21.put("jObj211", "value211"); // level 2 
jObj21.put("jObj212", "value212");
jObj21.put("jObj213", "value213");

jObj22.put("jObj221", "value221");
jObj22.put("jObj222", "value222");
jObj22.put("jObj223", "value223");

jObj2.put("jObj21", jObj21);  // level 1 
jObj2.put("jObj22", jObj22);

jObj.put("jObj1", jObj1); // level 0 
jObj.put("jObj2", jObj2);

I use those lines to get Json from an Obeject

GsonBuilder builder = new GsonBuilder();
Gson gSon = builder.create();
gSon.toJSon(jObj);

The Problem is when i parse the main Object ( jObj ) with Gson, i found an extra key named "nameValuePairs". So why i get this key?

Notice:

  • If i do : jObj.toString(); on Log, this key disappear.
  • If i do : jObj.opt("nameValuePairs"); i have Null as result (like there is no key named "nameValuePairs").

This is my actual result:

enter image description here

And this is what i expect to have:

enter image description here

I found something similar to my problem, but it doesn't help.

Is there someone who have a solution/workaround or can explain me the origin of this key?

Thanks.

like image 800
Rami Avatar asked Feb 09 '15 08:02

Rami


2 Answers

Try to use Gson's JsonObject instead of JSONObject like this:

 JsonObject jObj = new JsonObject();

    JsonObject jObj1 = new JsonObject();
    JsonObject jObj2 = new JsonObject();

    JsonObject jObj21 = new JsonObject();
    JsonObject jObj22 = new JsonObject();

    jObj1.addProperty("jObj11", "value11");
    jObj1.addProperty("jObj12", "value12");


    jObj21.addProperty("jObj211", "value211"); // level 2
    jObj21.addProperty("jObj212", "value212");
    jObj21.addProperty("jObj213", "value213");

    jObj22.addProperty("jObj221", "value221");
    jObj22.addProperty("jObj222", "value222");
    jObj22.addProperty("jObj223", "value223");

    jObj2.add("jObj21", jObj21);  // level 1
    jObj2.add("jObj22", jObj22);

    jObj.add("jObj1", jObj1); // level 0
    jObj.add("jObj2", jObj2);

    String json = new Gson().toJson(jObj);
like image 69
nbaroz Avatar answered Oct 19 '22 10:10

nbaroz


GSON is a tool for POJO serialization. If you are building JSONObject by yourself there is no need for gSon.toJSon(jObj); you can just call jObj.toString() to get the result.

The proper GSON usage would be to create POJO object for your data structure.

Your root object would look like this:

public class jObj {
    JObj11 jObj11;
    JObj12 jObj12;
}

After the whole structure is defined this way you can use gSon.toJSon(jObj); serialize it to JSON without any usage of JSONObject. GSON will traverse it and produce the JSON string.

In your example, GSON tries to serialize the internal structure of the JSONObject Java object, not the JSON structure it represents. As you can see, JSONObject uses nameValuePair to store it's content.

like image 7
atok Avatar answered Oct 19 '22 11:10

atok