Swift 4 JSON Parsing(预期解码 Array<Any> 但找到了字典)

Posted

技术标签:

【中文标题】Swift 4 JSON Parsing(预期解码 Array<Any> 但找到了字典)【英文标题】:Swift 4 JSON Parsing (Expected to decode Array<Any> but found a dictionary instead) 【发布时间】:2018-04-25 21:50:22 【问题描述】:

我似乎无法正确解码此 API 的结构。都是字典(...),但我的代码一直试图将其解构为数组。

错误代码:

 Error serialising json typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))
2018-04-25 22:41:50.570999+0100 APItest[40741:729417] TIC Read Status [1:0x0]: 1:57
2018-04-25 22:41:50.571127+0100 APItest[40741:729417] TIC Read Status [1:0x0]: 1:57

用于解析的 API 链接: https://api.coinbase.com/v2/exchange-rates?currency=BTC

代码:

func mainExchanges()
    let jsonUrlString = "https://api.coinbase.com/v2/exchange-rates?currency=BTC"
    guard let url = URL(string: jsonUrlString) else
     return 

    URLSession.shared.dataTask(with: url)
         (data,response,err) in
            guard let data = data else
            
                print("Error: No data to decode")
                return
            
            do
            
                let exchanges = try
                    JSONDecoder().decode([Exchanges].self, from: data)
                print(exchanges[0].data.rates.EUR)
            
            catch let jsonErr
                
                    print("Error serialising json",jsonErr)
                
        
    .resume()

结构:

 struct Exchanges: Decodable   
        let data: currency

        struct currency: Decodable 
            let currency: String
            let rates: Rates

            struct Rates: Decodable 
                let GBP: String
                let EUR: String
                let USD: String
            
        
    

我也尝试过将其结构化为

struct Exchanges  
     struct currency 
         struct rates 

【问题讨论】:

[Exchanges].self 你告诉你的JSONDecoder 它必须解码Exchanges 对象的数组,而实际上它是一个数组。至少删除方括号。 之前没有看到这条评论。非常感谢您的帮助 【参考方案1】:

您的数据不是数组,而是字典。 要解析它,您可以使用:

let exchanges = try
                JSONDecoder().decode(Exchanges.self, from: data)

如果要将其转换为数组,则将数组的新对象设为:

let exchange: [Exchanges] = [exchanges]

【讨论】:

知道这很愚蠢!我最初确实尝试过没有括号,但我认为我这样做时结构布局是错误的。非常感谢尚查尔。附:我确实投了赞成票,但由于我的代表少于 15 个,所以它说它不会显示

以上是关于Swift 4 JSON Parsing(预期解码 Array<Any> 但找到了字典)的主要内容,如果未能解决你的问题,请参考以下文章

Swift3 Json Parsing - 如何访问相关字段

Swift 4 JSON 解码根数组

Swift 4 - Json 解码器

动态 JSON 解码 Swift 4

Swift 4 解码简单的根级 json 值

如何解码包含数组 Swift 4 的 JSON 文件?