我有一個JSON對象,這是我在Java程序中構建的。這些值的順序是否在JSON對象中很重要?
JSONObject jObj = {"AAA:aaa","BBB:bbb","CCC:ccc"}
我將這個對象發送到一個服務器,它期望在以下類型的JSON對象。
{"BBB:bbb", "AAA:aaa", "CCC:ccc"}
我的問題是,服務器端的JSON對象的順序真的很重要嗎?如果是,我該如何更改訂單?
我有一個JSON對象,這是我在Java程序中構建的。這些值的順序是否在JSON對象中很重要?
JSONObject jObj = {"AAA:aaa","BBB:bbb","CCC:ccc"}
我將這個對象發送到一個服務器,它期望在以下類型的JSON對象。
{"BBB:bbb", "AAA:aaa", "CCC:ccc"}
我的問題是,服務器端的JSON對象的順序真的很重要嗎?如果是,我該如何更改訂單?
我的問題是,服務器端的JSON對象的順序真的很重要嗎?
它應該不是的問題。根據各種JSON規範,屬性的順序並不重要。例如:
「對象是無序的一組名稱/值對。」 (來源json.org)
「對象是零個或多個名稱/值對的無序集合,其中名稱是字符串,值是字符串,數字,布爾值,空對象或數組。 (來源RFC 7159)
不幸的是,笨蛋在那裏誰忽視了規範的這一方面,並把屬性的順序上有一定意義。 (通常在指定API的人與執行它們的人之間斷開連接時發生錯誤,並且執行規範工作的人員並不真正瞭解JSON。)
幸運的是,有可能設計/實施服務器沒有犯這個錯誤。我遇到的所有Java JSON解析器在解析時都不保留屬性順序...默認情況下爲。很難意外實現一個服務器,其中解析的JSON屬性的順序是重要的。
如果是,我該如何更改訂單?
困難,我擔心:
Map
對象。如果使用LinkedHashMap
或TreeMap
,則應保留插入順序或屬性鍵的詞法順序。1 - 例如,笨蛋,這個可憐的開發工作爲... https://stackoverflow.com/a/4515863/139985
2 - RFC 7159也這樣說:「JSON解析庫已觀察到它們是否使對象成員的順序對調用軟件可見是不同的其行爲不依賴於成員順序的實現將是可互操作的,因爲它們不會受到這些差異的影響。「」。根據我的閱讀,這建議JSON庫應該隱藏任何應用程序代碼對的順序。
3 - JSON-simple:https://code.google.com/p/json-simple/。也可能有其他人。
感謝您的描述性信息。是的,這是服務器端的錯誤。 –
只是爲了讓讀者更清楚,如果通過JSON規範的摘錄更新此答案,並提到「順序無關緊要」,將會有所幫助。 –
更新............ –
你可以的假設你的服務器可以接受它:
{"list": [ {"AAA":"aaa"},{"BBB":"bbb"},{"CCC":"ccc"}]}
public static void jsonpdf()
{
LinkedHashMap<String,String> lm = new LinkedHashMap<>();
lm.put("BBB","bbb");
lm.put("AAA","aaa");
lm.put("CCC","ccc");
Gson gson = new Gson();
String json = gson.toJson(lm);
System.out.println(json);
}
JSON對象中的字段順序實際上可能很重要。這取決於您正在使用的序列化程序。例如,當你序列化一個繼承的對象時,你會得到一個額外的JSON字段,稱爲type =''。反序列化時,類型字段必須位於任何其他JSON字段之前,否則它將採用父類型。
你面臨的問題是什麼?任何錯誤或異常? –
JSON RFC(RFC 4627)說對象成員的順序無關緊要。 – fge
當谷歌把我帶回這裏時,注意未來的自我:當檢查對象相等時,MongoDB對鍵的排序很敏感。如果你有一個帶有_id的文件:{key1:「foo」,key2:「bar」},你不會在find({_ id:{key2:「bar」,key1:「foo」}})中找到它。 – ahains