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

时间:2015-02-09 08:26:55

标签: java android json gson

我正在尝试从其字段重建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)时,我找到了一个名为"nameValuePairs"的额外键。那么为什么我拿到这把钥匙?

通知

  • 如果我在日志上执行:jObj.toString();,此键将消失。
  • 如果我这样做:jObj.opt("nameValuePairs");我的结果是 Null (就像没有名为&#34的键; nameValuePairs")。

这是我的实际结果:

enter image description here

这就是我期望的:

enter image description here

我找到了something similar to my problem,但它没有帮助。

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

感谢。

5 个答案:

答案 0 :(得分:32)

尝试使用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);

答案 1 :(得分:6)

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来存储它的内容。

答案 2 :(得分:3)

当我想将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());

答案 3 :(得分:0)

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

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

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

<script src="https://mbostock.github.io/d3/d3.js"></script>
<script src="https://rawgit.com/tsayen/dom-to-image/master/src/dom-to-image.js"></script>
<div>
Using dom-to-image.js transform anny given html to a image (svg - no quality loss)<br>
  1. tansform html into svg<br>
  2. drow svg inside hidden canvas<br>
  3. export canvas jpg or png<br>
  4. I you like donwload the thing<br>
</div>
<button id='downloadbody'>Download body</button>
<button id='downloadcircle'>Download Circle</button>
<button id='downloadtable'>Download Table</button>
<div id="circle">
</div>
<div id="table">
</div>

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

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

答案 4 :(得分:0)

您可以使用以下解决方案:

   //org.json.JSONObject 
   JSONObject jObj = new JSONObject();  

  //com.google.gson.JsonObject
  JsonObject jObj1 = new JsonObject();
  jObj1.addProperty("jObj11", "value11");

  JsonObject jObj2 = new JsonObject();
  jObj2.addProperty("jObj12", "value12");

  //JSONObject put(String name, Object value)
  jObj.put("jObj1", jObj1); 
  jObj.put("jObj2", jObj2);

  //Result
   objectToJson(toMap(jObj));

  public Map<String, Object> toMap(JSONObject content) {
        final Map<String, Object> map = new HashMap<>(content.length());
        for (final Iterator<String> iterator = content.keys(); iterator.hasNext(); )          {
            final String key = iterator.next();
            map.put(key, get(key));
        }
        return map;
    }


  public static <T> String objectToJson(T object) {
     Gson gson = new GsonBuilder().setPrettyPrinting().create();
     return gson.toJson(object);
  }