如何在ios中正确解析json?
Posted
技术标签:
【中文标题】如何在ios中正确解析json?【英文标题】:How to parse json correctly in ios? 【发布时间】:2017-04-08 19:00:53 【问题描述】:例如,我需要从JSON example 获取“ex”范围的所有英文“text”值 我做什么:
let result = json["def"].arrayValue.map( $0["tr"].arrayValue.map $0["ex"] )
但结果我得到了一个双倍的质量,如果我打算得到所有“文本”,那么我将得到一个三元组。猜想应该是完成这项任务的另一种更优雅的方法。有没有人可以提出一个非常好的解决方案?
【问题讨论】:
问题是你并没有真正解析。您正在尝试对未解析的数据执行一些操作。为了简化您的代码,首先创建对象并将数据解析为对象。一旦有了对象,代码就会变得更简单,而且类型也很安全。 【参考方案1】:如果您的表达式给出了 3 个字符串数组,您可以在末尾添加 .reduce([], +)
以将 3 个数组加入
一个。
编辑:
我是凭记忆打字,说错话了。你会使用reduce,而不是join。
let result = json["def"]
.arrayValue
.map( $0["tr"].arrayValue.map $0["ex"] )
.reduce([], +)
这应该会给你你想要的。
编辑#2:
reduce 函数对序列(如数组)进行操作。它需要一个“初始结果”值作为进程的种子,然后是一个对 2 个元素进行操作并返回结果的闭包。 (“二进制”闭包)
+
运算符实际上是 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
【讨论】:
我猜你的意思是.joined()
?
我不明白如何使用joined() 方法,但我做了这个'let temp = json["def"].arrayValue.map( $0["tr"].arrayValue. map $0["ex"].arrayValue.map $0["text"].stringValue ) 让 res = temp.flatMap $0 .flatMap $0 '
其实我是凭记忆打字,记错了。我打算建议的运算符是减少。请参阅我的答案的编辑。以上是关于如何在ios中正确解析json?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?
JSON 解析返回 null 到 iOS(json 字符串看起来正确)