JSONObject不维护顺序

时间:2015-06-25 20:33:27

标签: java android json web-services

我正在使用Android应用程序连接到Web服务以存储CONTACT详细信息。 JSON请求数据基本上是5个CONTACT细节(名称和电话号码)以及accessToken(用于验证用户)。

我按顺序放置JSON对象的键值对,就像我想要生成它一样,但是当我在控制台上打印数据时,序列不会被维护。

我希望如何生成JSON

{
    "contact_1": {
        "name": "Person 1",
        "contact_num": "001"
    },
    "contact_2": {
        "name": "Person 2",
        "contact_num": "002"
    },
    "contact_3": {
        "name": "Person 3",
        "contact_num": "003"
    },
    "contact_4": {
        "name": "Person 4",
        "contact_num": "004"
    },
    "contact_5": {
        "name": "Person 5",
        "contact_num": "005"
    },
    "accessToken": "9n5h4jbtXFDl4"
}

JSON如何实际存在

{
    "contact_4": {
        "contact_num": "004",
        "name": "Person 4"
    },
    "contact_3": {
        "contact_num": "003",
        "name": "Person 3"
    },
    "contact_5": {
        "contact_num": "005",
        "name": "Person 5"
    },
    "accessToken": "84j48HCgtZ8b8",
    "contact_2": {
        "contact_num": "002",
        "name": "Person 2"
    },
    "contact_1": {
        "contact_num": "001",
        "name": "Person 1"
    }
}

用于生成JSON的代码

JSONObject jsonObjectInner = new JSONObject();
            JSONObject jsonObjectOuter = new JSONObject();
            try
            {
                jsonObjectInner.put("name", "Person 1");
                jsonObjectInner.put("contact_num", "001");
                jsonObjectOuter.put("contact_1", jsonObjectInner);


                jsonObjectInner = new JSONObject();
                jsonObjectInner.put("name", "Person 2");
                jsonObjectInner.put("contact_num", "002");
                jsonObjectOuter.put("contact_2", jsonObjectInner);


                jsonObjectInner = new JSONObject();
                jsonObjectInner.put("name", "Person 3");
                jsonObjectInner.put("contact_num", "003");
                jsonObjectOuter.put("contact_3", jsonObjectInner);

                jsonObjectInner = new JSONObject();
                jsonObjectInner.put("name", "Person 4");
                jsonObjectInner.put("contact_num", "004");
                jsonObjectOuter.put("contact_4", jsonObjectInner);


                jsonObjectInner = new JSONObject();
                jsonObjectInner.put("name", "Person 5");
                jsonObjectInner.put("contact_num", "005");
                jsonObjectOuter.put("contact_5", jsonObjectInner);

                accessToken = SettingConnector.readString(context, SettingConnector.ACCESS_TOKEN, null);
                jsonObjectOuter.put("accessToken", accessToken);


                commonAPI.SendRequest(value, "http://sandbox.example.com/setEmergencyNumbers");

有什么方法可以维持序列吗?

5 个答案:

答案 0 :(得分:2)

根据定义:

  

对象是一组无序的名称/值对。

因此JSONObject不需要,维持订单。

好的一面 - 如果你使用JSON库,你也不需要订购。

答案 1 :(得分:0)

您不能也不应该依赖JSON对象中元素的排序。

来自json.org

的JSON规范
  

对象是一组无序的名称/值对

答案 2 :(得分:0)

正如另一个答案所说,你不应该依赖JSONObject中的顺序。但是如果您因某种原因需要订购数据,可以使用JSONArray类。

答案 3 :(得分:0)

JSON本质上是一个无序的键/值对列表,如本答案中所述: [JSONObject : Why JSONObject changing the order of attributes

但是没关系,你可以通过

访问它的成员
varName.contact_1.name

我使用了varName,因为将这个JSON分配给变量会更容易使用它。

如果你想像处理数组那样处理每个元素,那么通过删除你的outter {}并用[]

替换它们来创建一个JSON数组

答案 4 :(得分:0)

您可以将这些联系人存储在json数组中。这将维持秩序。