JSON 顺序混淆

2022-08-31 12:35:59

我在尝试使页面按照我想要的顺序打印出来时遇到问题。在我的代码中,我输入了这个:JSONObject

JSONObject myObject = new JSONObject();
myObject.put("userid", "User 1");
myObject.put("amount", "24.23");
myObject.put("success", "NO");

但是,当我在页面上看到显示时,它会给出:

JSON 格式的字符串:[{"success":"NO", "userid":"User 1", "bid":24.23}]

我需要它按用户ID,数量,然后成功的顺序。已经尝试在代码中重新排序,但无济于事。我也试过....这里需要一些帮助,谢谢!!.append


答案 1

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

https://www.json.org/ 的 JSON 规范

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

因此,JSON库可以自由地重新排列元素的顺序。这不是一个错误。


答案 2

我同意其他答案。您不能依赖 JSON 元素的顺序。

但是,如果我们需要有一个有序的JSON,一种解决方案可能是准备一个包含元素的LinkedHashMap对象,并将其转换为JSONObject。

@Test
def void testOrdered() {
    Map obj = new LinkedHashMap()
    obj.put("a", "foo1")
    obj.put("b", new Integer(100))
    obj.put("c", new Double(1000.21))
    obj.put("d", new Boolean(true))
    obj.put("e", "foo2")
    obj.put("f", "foo3")
    obj.put("g", "foo4")
    obj.put("h", "foo5")
    obj.put("x", null)

    JSONObject json = (JSONObject) obj
    logger.info("Ordered Json : %s", json.toString())

    String expectedJsonString = """{"a":"foo1","b":100,"c":1000.21,"d":true,"e":"foo2","f":"foo3","g":"foo4","h":"foo5"}"""
    assertEquals(expectedJsonString, json.toString())
    JSONAssert.assertEquals(JSONSerializer.toJSON(expectedJsonString), json)
}

通常,顺序不会保留如下。

@Test
def void testUnordered() {
    Map obj = new HashMap()
    obj.put("a", "foo1")
    obj.put("b", new Integer(100))
    obj.put("c", new Double(1000.21))
    obj.put("d", new Boolean(true))
    obj.put("e", "foo2")
    obj.put("f", "foo3")
    obj.put("g", "foo4")
    obj.put("h", "foo5")
    obj.put("x", null)

    JSONObject json = (JSONObject) obj
    logger.info("Unordered Json : %s", json.toString(3, 3))

    String unexpectedJsonString = """{"a":"foo1","b":100,"c":1000.21,"d":true,"e":"foo2","f":"foo3","g":"foo4","h":"foo5"}"""

    // string representation of json objects are different
    assertFalse(unexpectedJsonString.equals(json.toString()))
    // json objects are equal
    JSONAssert.assertEquals(JSONSerializer.toJSON(unexpectedJsonString), json)
}

您也可以查看我的帖子:http://www.flyingtomoon.com/2011/04/preserving-order-in-json.html