Swift4 / JSON /解码

时间:2017-12-17 19:36:10

标签: swift swift4

我是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。(_7C60C6A5E9E301137DE95AF645AB94EB中的CodingKeys).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没有?

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分:0)

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

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

因为某些索引不包含name