如何在ios中正确解析json?

时间:2017-04-08 19:00:53

标签: ios json swift swifty-json

例如,我需要从JSON example获取“ex”范围的所有英文“text”值 我做了什么:

let result = json["def"].arrayValue.map({ $0["tr"].arrayValue.map { $0["ex"] } })

但结果我得到了一个双重大量,如果我打算得到所有“文本”,那么我将得到一个三重数组。猜猜应该是另一个更优雅的方法来完成这项任务。有人能展示出一个非常好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

如果你的表达式提供3个字符串数组,你可以在末尾添加.reduce([], +)以将3个数组加入 之一。

编辑:

我是从记忆中打字,并说错了。你会使用reduce,而不是加入。

let result = json["def"]
  .arrayValue
  .map({ $0["tr"].arrayValue.map { $0["ex"] } })
  .reduce([], +)

那可以给你你想要的东西。

编辑#2:

reduce函数对序列(如数组)进行操作。它需要一个"初始结果"为进程设置种子的值,然后是对2个元素进行操作的闭包,并返回结果。 (a"二进制"关闭) +运算符实际上是Swift中的二进制闭包。它需要2个元素并返回一个结果,因此您只需传入+而不是闭包。对于数组,+返回组合数组的结果。

因此,当您对数组数组使用reduce()并将[]作为初始结果时,它会将[]与第一个数组合并,然后是每个+运算符的结果与数组中的下一个条目。

以此简化代码为例:

//Start with an array of arrays of strings
let arrays = [
  ["string1", "string2", "string3"],
  ["string4", "string5", "string6"],
  ["string7", "string8", "string9"]
]

//First loop through the outer arrays and log their contents
for (index, object) in arrays.enumerated() {
  print("array[\(index)] = \(object)")
}

//Now combine the outer arrays into a single array
let combined = arrays.reduce([], + )

//Now print the entries in the combined array
print("\n---- combined arrays ----")
for (index, object) in combined.enumerated() {
  print("array[\(index)] = \(object)")
}

产生以下输出:

array[0] = ["string1", "string2", "string3"]
array[1] = ["string4", "string5", "string6"]
array[2] = ["string7", "string8", "string9"]

---- combined arrays ----
array[0] = string1
array[1] = string2
array[2] = string3
array[3] = string4
array[4] = string5
array[5] = string6
array[6] = string7
array[7] = string8
array[8] = string9