【问题标题】:swift parse json as per maintaining order按照维护顺序快速解析json
【发布时间】:2017-12-03 05:33:46
【问题描述】:

假设我有一个 json 字符串,其中有一个名为 data 的 json 数组。 该数组包含用户个人资料数据的 json 对象,例如姓名、年龄、性别等。

现在要按顺序解析该 json 对象,例如,如果对象是

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

}

我想像name,age,gender 一样按顺序解析列表,但是使用 ios,当我将 json 对象转换为字典时,顺序发生了变化,我知道字典没有排序,那么实现此目的的替代方法是什么?

它是第三方 api,所以我没有任何手,我们已经在 android 中使用链接哈希映射完成了它,但真的卡在了 swift 中,我最不想做的就是用正则表达式解析。

我通过以下方式解析 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;
}  

【问题讨论】:

  • 如你所说,字典没有顺序,为什么要保持顺序?顺序无关紧要。
  • 正如我所说的它的用户资料数据,我需要按顺序显示它,所以先命名,然后是年龄,然后是性别。如果在用户个人资料中首先是年龄,然后是姓名,然后是性别,那看起来会很奇怪。可能有数百万个原因,所以问题不是为什么,问题是如何。
  • 而不是字典使用自定义结构或类
  • 问题是key的response是动态的,可以改变,所以不能使用object mapping。每当我使用字典转换根 json 对象时,我都会看到内部数据节点值已更改。所以如果我去rootobject,然后获取数据对象,遍历它,并打印每个对象,键值已经改变了。
  • 如果键是动态的,你怎么知道顺序?您应该添加一个带有输入和预期输出的具体示例。

标签: ios json swift


【解决方案1】:

不要尝试订购字典。而是按照您想要的顺序创建一个键数组:

let keys = [“name”, “age”, “gender”]

然后和他们一起访问字典:

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

这将确保您期望的顺序。

【讨论】:

  • 我不能,因为密钥是来自服务器的动态并且可以更改,因此无法手动创建密钥数组。如果我可以以正确的顺序迭代 json 对象键,那将达到目的。
  • 除非服务器以“正确”顺序单独向您发送一个键数组,否则无法确定正确的含义。正如其他人所说,字典的键没有保证顺序,所以从字典的角度来看,任何顺序都是正确的。
【解决方案2】:

正如您所提到的,您无法在 Dictionary 中获取有序数据。如果可能的话,您可以在 JSON 中添加“订单”键,例如

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

这样你就可以根据顺序键进行排序了。

【讨论】:

  • 正如我所说,它是第三方 api,我没有任何处理。如果它在我身上,我会将每个键值作为 json 数组发送。
  • 如果可能的话,从第三方 api 获取排序 JSON 的逻辑并在 iOS 中使用同样的逻辑
猜你喜欢
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
相关资源
最近更新 更多