【问题标题】:JSONObject does not maintain order [duplicate]JSONObject 不维护顺序 [重复]
【发布时间】:2015-09-12 15:28:44
【问题描述】:

我正在使用 Android 应用程序连接到网络服务以存储 CONTACT 详细信息。 JSON 请求数据基本上是 5 个联系人详细信息(姓名和电话号码)以及一个 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");

有什么方法可以保持顺序吗?

【问题讨论】:

    标签: java android json web-services


    【解决方案1】:

    根据定义:

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

    所以JSONObject 不是必需的,并且维持秩序。

    从好的方面来说 - 如果您使用 JSON 库,则无论如何都不需要排序。

    【讨论】:

      【解决方案2】:

      正如另一个答案所说,您不应依赖 JSONObject 中的顺序。但是,如果您出于某种原因想要对数据进行排序,则可以使用 JSONArray 类。

      【讨论】:

        【解决方案3】:

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

        来自json.org的 JSON 规范

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

        【讨论】:

          【解决方案4】:

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

          不过没关系,你可以通过这样做来访问它的成员

          varName.contact_1.name
          

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

          如果您想像数组一样处理每个元素,则通过删除外部{} 并将它们替换为 [] 来创建 JSON 数组

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 2012-04-12
              • 2018-06-16
              • 2013-10-10
              • 2020-01-06
              • 2011-02-27
              • 2015-04-28
              • 2013-08-08
              • 1970-01-01
              • 2017-10-12
              相关资源
              最近更新 更多