2017-12-03 210 views
0

假設我有一個json字符串,其中有一個名爲data的json數組。 陣列保持例如姓名,年齡,性別等用戶簡檔數據的JSON對象按維護順序快速解析json

現在要解析JSON對象按順序,例如,如果該對象是

{ 
    "name": "sample name", 
    "age": "30", 
    "gender": "male" 

} 

我想按照像name,age,gender這樣的順序解析列表,但是使用ios,當我將json對象轉換爲字典時,順序發生了變化,我知道字典沒有排序,所以實現此目的的替代方法是什麼?

它的第三方api所以我沒有任何的手,我們已經在android中使用鏈接哈希映射完成它,但真的卡在迅速,我想要做的最後一件事是用正則表達式解析。

IM解析JSON的方式如下:

var rootData = try JSONSerialization.jsonObject(with: data!) as! [String:Any] 
    if let val = fromList["data"] { 

let dataNode = val as! [[String:Any]] 

for row in dataNode { 


for (key,keyVal) in row { 
//here the key is not in order.because when we cast it as dictionary the order gets changed. 


    } 

} 

爲Android我們已經實現了與下面的函數來做到這一點:

public ArrayList<LinkedHashMap<String, Object>> parseJsonArrayList(String odata, String arrayName) { 
ArrayList<LinkedHashMap<String, Object>> mylist = new ArrayList<>(); 

try { 
JSONObject e = new JSONObject(odata); 
JSONArray data = e.getJSONArray(arrayName); 

for(int i = 0; i < data.length(); ++i) { 
JSONObject v = data.getJSONObject(i); 
LinkedHashMap<String, Object> map = new LinkedHashMap<>(100, 0.75f, false); 
Iterator keys = v.keys(); 

while(keys.hasNext()) { 
String key = String.valueOf(keys.next()); 
//gph.log("debug4", key); 
map.put(key, v.getString(key)); 
//gph.log("debug4", v.getString(key)); 
} 

mylist.add(map); 
} 
} catch (JSONException var10) { 
var10.printStackTrace(); 
} 

return mylist; 
} 
+3

正如你所說,字典沒有秩序,所以你爲什麼需要保持秩序?該命令無關緊要。 – rmaddy

+0

正如我所說的用戶配置文件數據,我需要按照順序來顯示它,所以首先命名,然後是年齡,然後是性別。如果在用戶配置文件年齡第一,然後名稱然後性別,這將看起來很奇怪。 可能有數百萬的原因,所以問題不是爲什麼,問題是如何。 –

+1

而不是字典使用自定義結構或類 – vadian

回答

1

不要試圖訂購字典。相反,在創造你想要的順序按鍵的排列:

let keys = [「name」, 「age」, 「gender」] 

然後查閱字典與他們:

for key in keys { 
    let value = dict[key] 
    // Present the value. 
} 

這將確保你所期望的順序。

+0

我不能,導致密鑰是動態的從服務器,可以改變,所以手動創建一個密鑰數組是不可能的。 如果我可以用正確的順序迭代json對象的鍵,這將有助於達到目的。 –

+0

除非服務器以「正確」的順序分別發送給你一個密鑰數組,否則無法確定什麼是正確的方法。正如其他人所說,他的字典鍵沒有保證的順序,所以從字典的角度來看,任何順序都是正確的。 –

0

正如您所提到的,您無法獲取Dictionary中的有序數據。如果可能的話,你可以在你的JSON添加「命令」鍵像

[ 
    { 
    "name": "sample name", 
    "order": 1 
    }, 
    { 
    "age": "30", 
    "order": 1 
    }, 
    { 
    "gender": "", 
    "male": "", 
    "order": 1 
    } 
] 

,以便根據訂單鍵可以進行排序。

+0

正如我所說,它的第三方API,我沒有任何處理它。 如果它在我身上,我會發送每個關鍵vallue作爲json數組。 –

+0

如果可能的話,從第三部分api獲取訂購JSON的邏輯,並在iOS中使用相同的 –