Strange "namevaluepairs" Key Appear When Using Gson
Solution 1:
Try to use Gson's JsonObject
instead of JSONObject
like this:
JsonObjectjObj=newJsonObject();
JsonObjectjObj1=newJsonObject();
JsonObjectjObj2=newJsonObject();
JsonObjectjObj21=newJsonObject();
JsonObjectjObj22=newJsonObject();
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);
Stringjson=newGson().toJson(jObj);
Solution 2:
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:
publicclassjObj {
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.
Solution 3:
I had the same problem when I wanted to use Gson only for pretty print. JsonObject is working fine but if you still want to use JSONObject instead of JsonObject then you can use it that way:
publicclassJsonUtil {
publicstatic String toPrettyFormat(String jsonString)
{
JsonParserparser=newJsonParser();
JsonObjectjson= parser.parse(jsonString).getAsJsonObject();
Gsongson=newGsonBuilder().setPrettyPrinting().create();
StringprettyJson= gson.toJson(json);
return prettyJson;
}
}
and simply pass JSONObject as string like this:
StringprettyJson= JsonUtil.toPrettyFormat(jsonObject.toString());
Solution 4:
Finally, I found a solution for this problem. Instead of saving my JSONObject using Gson, I will simply save it as string using toString() and rebuild the original JSONObject later by wrapping saved string into JSONArray as in following example.
In my case i din't have choice to change JSONObject to com.google.gson.JsonObject as suggested in accepted answer because my 90% coding was done and such a change would have ruined my days and nights. Following is the piece of code that worked for me:
For example, save JSONObject to shared preference (or DB) like this:
publicvoidsaveJson(JSONObject reqJson){
sharedPref.editor().put("savedjson_key",reqJson.toString()).apply();
}
Then, when you want to rebuild the original JSONObject:
publicJSONObjectgetSavedJson() {
String reqJson=sharedPref.getString("savedjson_key");
if (reqJson != null) {
try {
JSONArray arr = newJSONArray(("["+reqJson+"]").replaceAll("\\\\", ""));
return arr.getJSONObject(0);
} catch (JSONException e) {
e.printStackTrace();
}
}
returnnull;
}
Solution 5:
You can use this solution:
//org.json.JSONObject JSONObject jObj = newJSONObject();
//com.google.gson.JsonObjectJsonObject jObj1 = newJsonObject();
jObj1.addProperty("jObj11", "value11");
JsonObject jObj2 = newJsonObject();
jObj2.addProperty("jObj12", "value12");
//JSONObject put(String name, Object value)
jObj.put("jObj1", jObj1);
jObj.put("jObj2", jObj2);
//ResultobjectToJson(toMap(jObj));
publicMap<String, Object> toMap(JSONObject content) {
final Map<String, Object> map = newHashMap<>(content.length());
for (final Iterator<String> iterator = content.keys(); iterator.hasNext(); ) {
final String key = iterator.next();
map.put(key, get(key));
}
return map;
}
publicstatic <T> StringobjectToJson(T object) {
Gson gson = newGsonBuilder().setPrettyPrinting().create();
return gson.toJson(object);
}
Post a Comment for "Strange "namevaluepairs" Key Appear When Using Gson"