2015-10-02 49 views
0

当您在JSONObject中添加数据时,它将以自己的方式进行存储。 这是我想传达的例子。JAVA:将数据保存在JSON中

JSONObject obj = new JSONObject(); 

obj.put("metricname", "splunk-ui"); 
obj.put("timestamp", 1234567890); 
obj.put("value",34); 


System.out.println(obj); 

上面的代码片段将给出下面的输出。

{ 
    "metricname": "splunk-ui", 
    "value": 34, 
    "timestamp": 1234567890 
} 

这里的问题是: -

我在这个序列中添加数据: - metricnametimestampvalue

这是显示序列: - metricnamevaluetimestamp

那么,我如何执行我的数据添加顺序JSONObject ??

供参考: -这样做是因为mendatory我将这个JSON对象传递给可在metricnametimestamp,仅value扫描数据的另一API。

这里我张贴的代码片段,我用来解决这个问题: -

我已经使用GSON库,此链接使此代码工作。 GSON Documention

JsonObject jsonObject = new JsonObject(); 

jsonObject.addProperty("metric", "mihirmonani"); 
jsonObject.addProperty("timestamp", 1346846400); 
jsonObject.addProperty("value", 14); 

JsonArray jArray = new JsonArray(); 

JsonObject jObject = new JsonObject(); 

jObject.addProperty("host", "splunk"); 
jObject.addProperty("host1", "splunk1"); 

jsonObject.add("tags",jObject); 

System.out.println(jsonObject); 
+0

JSON对象的属性没有顺序。这不是特定于Java或任何实现。如果您需要特定的订单,则必须在JSON中使用数组,而不是对象。确保你了解差异。 –

回答

0

你不能用一个JSONObject维持秩序的唯一方法是使用一个JSONArray

[ 
     {"name" : "metricname", "value" : "splunk-ui"}, 
     {"name" : "value", "value" : 34}, 
     {"name" : "timestamp", "value" : 1234567890} 
    ] 
0

简短的回答:不能。 JSONObject内部使用HashMap,它根据散列码的顺序返回值。

您可以使用JSONWriter明确写入值。

编辑:澄清,正如Manu指出的那样,在将值放入JSONObject之后,您无法检索到该订单。我的建议是不要将JSONObject中的值作为开始,而是使用JSONWriter直接写入值。

+0

原因不是JSONObject的实现方式。原因是JSON没有指定JSON对象的属性顺序。这就是JSON的工作原理。使用JSONWriter不会改变这一点。 –

+0

尽管JSON没有指定任何顺序是正确的,但决不意味着实现对发送值的顺序没有任何影响。 JSONObject是一个实现,而不是一个规范,它按照它们从内部HashMap迭代的顺序发出值。 JSONWriter直接写入值,所以顺序就是你编写它们的方式。 JSON解析器在预期某个订单时不正确只意味着它是一个糟糕的JSON解析器,并不是您无法按照预期的方式发出值。 –

+0

@PatrickSimpson当然,您可以按某种顺序编写值,但从不按照它们插入的顺序编写值,因为该顺序未知。 – Manu