Swift4 / JSON / Decode

问题描述 投票:0回答:2

我是Swift 4的新手,我找了几个小时来找到解决问题的方法。

import Foundation 

public struct Coin: Codable {
  let name:   String //= "Default"
  let symbol: String
}

open class CoinCapIOAPI {

func fetchMap() {

    let urlString = "http://socket.coincap.io/map"
    guard let url = URL(string: urlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, error) in
        // Maybe later...
        guard let data = data else { return }

        do {

            let coins = try JSONDecoder().decode([Coin].self, from: data)
            print(coins)


        } catch let jsonErr {
            print("Error: ", jsonErr)
        }

        }.resume()
   }
}

JSON看起来像:

[
{ aliases: [ ],
name: "300 Token",
symbol: "300",
},
{
aliases: [ ],
name: "SixEleven",
symbol: "611",
},
]

我只需要namesymbol。但是如果没有结构中的默认名称,我会收到以下错误:

错误:keyNotFound(CoinBartender.Coin。(CodingKeys in _7C60C6A5E9E301137DE95AF645AB94EB).name,Swift.DecodingError.Context(codingPath:[Foundation。(_ JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue:“Index 91”,intValue:Optional(91))],debugDescription :“没有与键名称相关的值(\”name \“)。”,underlyingError:nil))

如果我为“name”添加默认值,我会得到以下结果:

[CoinBartender.Coin(名称:“默认”,符号:“300”),CoinBartender.Coin(名称:“默认”,符号:“611”),

为什么symbol工作,但name不工作?

swift swift4
2个回答
2
投票

请仔细阅读错误消息。它正是在描述这个问题:

错误:keyNotFound(CoinBartender.Coin。(CodingKeys in _7C60C6A5E9E301137DE95AF645AB94EB).name,Swift.DecodingError.Context(codingPath:[Foundation。(_ JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue:“Index 91”,intValue:Optional(91))],debugDescription :“没有与键名称相关的值(\”name \“)。”,underlyingError:nil))

它说第92条(索引从零开始)没有关键的name

{"aliases":[],"symbol":"QTM"} 

一种解决方案是将name声明为可选

let name: String?

0
投票

您的Coin结构应该是这样的:

public struct Coin: Codable {
    let name:   String? //= "Default"
    let symbol: String
}

因为有些索引不包含name

© www.soinside.com 2019 - 2024. All rights reserved.