You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:37:54