使用Gson时会出现奇怪的“nameValuePairs”键

我正在尝试从其字段重建一个Object (我将字段作为JSONObject),如下所示:

 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); 

我使用这些行从Obeject获取Json

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

问题是当我用Gson解析主Object (jObj)时,我find了一个名为"nameValuePairs"的额外键。 那么为什么我拿到这把钥匙呢?

通知

  • 如果我这样做: jObj.toString(); 在日志上,这个键消失了。
  • 如果我这样做: jObj.opt("nameValuePairs"); 我有Null作为结果(就像没有名为“nameValuePairs”的键)。

这是我的实际结果:

在此处输入图像描述

这就是我期望的:

在此处输入图像描述

我find了与我的问题类似的东西 ,但它没有帮助。

是否有人有解决方案/解决方法或可以解释这个密钥的来源?

谢谢。

尝试使用Gson的JsonObject而不是JSONObject如下所示:

  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); 

GSON是POJO序列化的工具。 如果你自己构建JSONObject,则不需要gSon.toJSon(jObj); 你可以调用jObj.toString()来获得结果。

正确的GSON用法是为您的数据结构创建POJO对象。

您的根对象看起来像这样:

 public class jObj { JObj11 jObj11; JObj12 jObj12; } 

以这种方式定义整个结构后,您可以使用gSon.toJSon(jObj); 将其序列化为JSON而不使用任何JSONObject。 GSON将遍历它并生成JSON字符串。

在您的示例中,GSON尝试序列化JSONObject Java对象的内部结构,而不是它所代表的JSON结构。 如您所见,JSONObject使用nameValuePair来存储它的内容。

当我只想使用Gson打印时,我遇到了同样的问题。 JsonObject工作正常,但如果你仍然想使用JSONObject而不是JsonObject,那么你可以这样使用它:

 public class JsonUtil { public static String toPrettyFormat(String jsonString) { JsonParser parser = new JsonParser(); JsonObject json = parser.parse(jsonString).getAsJsonObject(); Gson gson = new GsonBuilder().setPrettyPrinting().create(); String prettyJson = gson.toJson(json); return prettyJson; } } 

并简单地将JSONObject作为字符串传递:

 String prettyJson = JsonUtil.toPrettyFormat(jsonObject.toString()); 

最后,我find了解决这个问题的方法。 我不是使用Gson保存我的JSONObject,而是使用toString()将其保存为字符串,然后通过将保存的字符串包装到JSONArray中来重建原始的JSONObject,如下例所示。

在我的情况下,我没有选择将JSONObject更改为com.google.gson.JsonObject,如接受答案中所建议的那样,因为我的90%编码完成了,这样的改变会破坏我的日日夜夜。 以下是适合我的代码:

例如,将JSONObject保存到共享首选项(或DB),如下所示:

 public void saveJson(JSONObject reqJson) { sharedPref.editor().put("savedjson_key",reqJson.toString()).apply(); } 

然后,当您想要重建原始JSONObject时:

  public JSONObject getSavedJson() { String reqJson=sharedPref.getString("savedjson_key"); if (reqJson != null) { try { JSONArray arr = new JSONArray(("["+reqJson+"]").replaceAll("\\\\", "")); return arr.getJSONObject(0); } catch (JSONException e) { e.printStackTrace(); } } return null; }