2017-12-03 220 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中使用相同的 –