JSON顺序混合起来

我有一个问题,试图使我的页面打印出我想要的顺序的JSONObject 。 在我的代码中,我input了这个:

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

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

JSON格式的string: [{"success":"NO","userid":"User 1","bid":24.23}

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

你不能也不应该依赖于JSON对象中元素的sorting。

http://www.json.org/上的JSON规范;

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

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

我同意其他答案。 你不能依赖于JSON元素的sorting。

但是,如果我们需要有一个有序的JSON,一个解决scheme可能是准备一个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) } 

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

从lemiorhan例子我可以解决只是改变一些lemiorhan的代码使用行:

 JSONObject json = new JSONObject(obj); 

而不是这个:

 JSONObject json = (JSONObject) obj 

所以在我的testing代码是:

 Map item_sub2 = new LinkedHashMap(); item_sub2.put("name", "flare"); item_sub2.put("val1", "val1"); item_sub2.put("val2", "val2"); item_sub2.put("size",102); JSONArray itemarray2 = new JSONArray(); itemarray2.add(item_sub2); itemarray2.add(item_sub2);//just for test itemarray2.add(item_sub2);//just for test Map item_sub1 = new LinkedHashMap(); item_sub1.put("name", "flare"); item_sub1.put("val1", "val1"); item_sub1.put("val2", "val2"); item_sub1.put("children",itemarray2); JSONArray itemarray = new JSONArray(); itemarray.add(item_sub1); itemarray.add(item_sub1);//just for test itemarray.add(item_sub1);//just for test Map item_root = new LinkedHashMap(); item_root.put("name", "flare"); item_root.put("children",itemarray); JSONObject json = new JSONObject(item_root); System.out.println(json.toJSONString()); 

真正的答案可以在规范中find,JSON是无序的。 然而,作为一个读者,我按重要性排列了我的元素。 这不仅是一种更为逻辑的方式,而且更容易阅读。 也许规范的作者从来没有读过JSON,我做..所以,这里来一个修复:

 /** * I got really tired of JSON rearranging added properties. * Specification states: * "An object is an unordered set of name/value pairs" * StackOverflow states: * As a consequence, JSON libraries are free to rearrange the order of the elements as they see fit. * I state: * My implementation will freely arrange added properties, IN SEQUENCE ORDER! * Why did I do it? Cause of readability of created JSON document! */ private static class OrderedJSONObjectFactory { private static Logger log = Logger.getLogger(OrderedJSONObjectFactory.class.getName()); private static boolean setupDone = false; private static Field JSONObjectMapField = null; private static void setupFieldAccessor() { if( !setupDone ) { setupDone = true; try { JSONObjectMapField = JSONObject.class.getDeclaredField("map"); JSONObjectMapField.setAccessible(true); } catch (NoSuchFieldException ignored) { log.warning("JSONObject implementation has changed, returning unmodified instance"); } } } private static JSONObject create() { setupFieldAccessor(); JSONObject result = new JSONObject(); try { if (JSONObjectMapField != null) { JSONObjectMapField.set(result, new LinkedHashMap<>()); } }catch (IllegalAccessException ignored) {} return result; } } 

JavaScript对象和JSON无法设置键的顺序。 你可能正确地使用Java(我不知道Java对象是如何工作的),但是如果它发送给Web客户端或JSON的另一个消费者,则不能保证密钥的顺序。

从这个https://code.google.com/p/json-simple/downloads/detail?name=json_simple-1.1.jar&can=2&q=下载“json simple 1.1 jar”

并将jar文件添加到lib文件夹

使用JSONValue你可以将LinkedHashMap转换为jsonstring

更多的参考请点击这里http://androiddhina.blogspot.in/2015/09/ordered-json-string-in-android.html

正如所有人都告诉你,JSON不维护“序列”,但数组做的,也许这可以说服你: 有序的JSONObject

你可以保留顺序,如果你使用属于com.google.gson:D的JsonObject

 JsonObject responseObj = new JsonObject(); responseObj.addProperty("userid", "User 1"); responseObj.addProperty("amount", "24.23"); responseObj.addProperty("success", "NO"); 

这个JsonObject的用法甚至不会使用Map <>

干杯!!!

对于那些使用maven的人,请尝试com.github.tsohr / json

 <!-- https://mvnrepository.com/artifact/com.github.tsohr/json --> <dependency> <groupId>com.github.tsohr</groupId> <artifactId>json</artifactId> <version>0.0.1</version> </dependency> 

它是从JSON-java派生出来的,但是使用 @lemiorhan指出的LinkedHashMap来切换它的地图实现。

对于Java代码,请为您的对象创build一个POJO类,而不是JSONObject。 并为您的POJO类使用JSONEncapsulator。 这样的元素顺序依赖于POJO类中的getter setter的顺序。 例如。 POJO类会像

 Class myObj{ String userID; String amount; String success; // getter setters in any order that you want 

以及你需要发送你的json对象作为回应

 JSONContentEncapsulator<myObj> JSONObject = new JSONEncapsulator<myObj>("myObject"); JSONObject.setObject(myObj); return Response.status(Status.OK).entity(JSONObject).build(); 

这条线的反应将是

{myObject:{//属性顺序与getter setter顺序相同。}}