2

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

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

结果到

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

为什么?

有什么办法可以防止吗?

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

4

2 回答 2

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

希望这会帮助你。:)

于 2013-08-30T10:54:28.097 回答
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;

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

如果您还有任何疑问,请告诉我。

于 2013-08-29T11:40:00.740 回答