2015-10-02 73 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