nameValuePair键添加在新的JSONObject中

时间:2013-08-29 10:33:18

标签: java android json

当我从字符串构建一个json对象时,会附加一个根键“nameValuePairs”。

String curStr = "{\"e\": \"{}\", \"f\": \"{}\", \"g\": \"{}\"}";
JSONObject oldObj = new JSONObject(curStr);

结果

{"nameValuePairs":{"b":"{}","c":"{}","a":"{}"}}

为什么?

有什么方法可以阻止这种情况吗?

顺便说一下,我使用字符串json来表示我将在稍后使用的实际json。

2 个答案:

答案 0 :(得分:1)

首先你的json在语法上是正确的,但我想你希望将对象表示为值,在你的情况下,大括号被评估为简单的字符串:

String curStr = "{\"e\": \"{}\", \"f\": \"{}\", \"g\": \"{}\"}";
JSONObject oldObj = new JSONObject(curStr);

使用像这样的json将生成值作为对象:

String curStr = "{\"e\": {}, \"f\": {}, \"g\": {}}";
JSONObject oldObj = new JSONObject(curStr);

无论如何,我试图创建那个JSONObject然后打印它的toString,它只会打印json,没有任何附件名称。

正如你在评论中发现问题是由Gson给出的,它会将JSONObject评估为地图。我尝试了一个小例子,我有“地图”作为字段。可能我已经尝试了不同版本的Gson。

Gson gson = new Gson();
String jsonStr = gson.toJson(oldObj);

结果:{"map":{"f":"{}","g":"{}","e":"{}"}}

如果要创建自定义对象并使用Gson反序列化json,请创建具有这些属性的类并使用fromJson(String json,Class clazz)方法

public class Test {
    private String e;
    private String f;
    private String g;
}

Gson gson = new Gson();
Test myTestObj = gson.fromJson(curStr, Test.class);

希望这会对你有所帮助。 :)

答案 1 :(得分:0)

您可以尝试使用jsonStringer。

如下代码:

 JSONStringer jObject = new JSONStringer()
            .object()
               .key("UserName").value(userNameValue)
               .key("Name").value(nameValue)
               .key("EmailId").value(emailIdValue)
               .key("CountryId").value(contryIdValue)
               .key("CountryName").value("") // It should be blank As Spanish Name is not set if User have App in Spanish
               .key("State").value(stateValue)
               .key("City").value(cityValue)
               .key("ImageByteArray").value(imageBytes)
             .endObject();

<强>更新

我刚在我的应用程序中使用您的代码并进行检查。

它向我展示了我们已经形成的结果。 我得到的结果是:

{
   "f": "{}",
   "g": "{}",
   "e": "{}"
}

请检查您要导入的包裹。 为了您的参考,我将在类下面导入以表示json对象。

import org.json.JSONException;
import org.json.JSONObject;

只需导入上面的类并查看结果。

如果您还有任何疑问,请与我们联系。