使用SwiftyJSON解包字符串时存在问题,输出结果为["AAPL"]
解决SwiftyJSON解包字符串输出["AAPL"]的问题
我来帮你搞定这个解析问题~你现在输出["AAPL"]是因为用了String(describing:)把整个字符串数组转换成了字面量格式的字符串,而不是直接提取里面的单个元素。下面是具体的修正方案:
问题根源
你的代码里jsonArray.map({$0["1. symbol"].stringValue})会生成一个[String]类型的数组(比如["AAPL"]),再用String(describing:)包装后,就会把数组的完整结构(包括方括号和引号)输出,这不是你想要的单个字符串值。
修正后的代码方案
方案1:获取单个元素(如果数组只有一个symbol)
如果返回的Stock Quotes数组里只有一个股票代码,直接取数组第一个元素即可:
do { stockData = try Data(contentsOf: url!) let json = try JSON(data: stockData) if let jsonArray = json["Stock Quotes"].array { // 用compactMap过滤掉可能的nil值,更安全 let tickers = jsonArray.compactMap({ $0["1. symbol"].string }) // 取第一个元素并输出 if let firstTicker = tickers.first { print(firstTicker) // 输出:AAPL } } } catch { print("解析错误:\(error)") }
方案2:处理多个元素(如果数组有多个股票代码)
如果返回多个股票代码,可以把它们拼接成字符串输出:
do { stockData = try Data(contentsOf: url!) let json = try JSON(data: stockData) if let jsonArray = json["Stock Quotes"].array { let tickers = jsonArray.compactMap({ $0["1. symbol"].string }) // 用逗号分隔拼接所有代码 let allTickers = tickers.joined(separator: ", ") print(allTickers) // 输出:AAPL, MSFT, GOOG... } } catch { print("解析错误:\(error)") }
额外优化建议
- 用
compactMap替代map+stringValue:$0["1. symbol"].string是可选型,当key不存在或值不是字符串时会返回nil,compactMap会自动过滤这些nil值,避免空字符串干扰。 - 加上do-catch块捕获
Data(contentsOf:)和JSON(data:)可能抛出的错误,让代码更健壮。
内容的提问来源于stack exchange,提问作者husharoonie
相关产品推荐
相关产品推荐

