首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift4 / JSON /解码

Swift4 / JSON /解码
EN

Stack Overflow用户
提问于 2017-12-17 19:36:10
回答 2查看 343关注 0票数 0

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

代码语言:javascript
复制
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看起来像:

代码语言:javascript
复制
[
{ aliases: [ ],
name: "300 Token",
symbol: "300",
},
{
aliases: [ ],
name: "SixEleven",
symbol: "611",
},
]

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

错误:_12768CA107A31EF2DCE034FD75B541C9)(stringValue:(CoinBartender.Coin.(CodingKeys in _7C60C6A5E9E301137DE95AF645AB94EB).name,Swift.DecodingError.Context(codingPath: Foundation.)(_JSONKey在_JSONKey中“索引91",intValue:可选(91)),debugDescription:”没有与键名关联的值(\“name \”)。“,underlyingError: 0)

如果我添加"name“的默认值,就会得到以下结果:

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

为什么symbol能工作,而name却不能工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-17 19:54:32

请仔细阅读错误信息。它准确地描述了这个问题:

错误:keyNotFound(CoinBartender.Coin.(CodingKeys in _7C60C6A5E9E301137DE95AF645AB94EB).name,Swift.DecodingError.Context(codingPath: Foundation.(_JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue:"Index 91",intValue:可选(91)),debugDescription:"No值与键名(\“name \”.“,underlyingError: nil)关联)

它说第92项(索引是基于零的)没有键name

代码语言:javascript
复制
{"aliases":[],"symbol":"QTM"} 

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

代码语言:javascript
复制
let name: String?
票数 2
EN

Stack Overflow用户

发布于 2017-12-17 19:54:39

你的硬币结构应该是这样:

代码语言:javascript
复制
public struct Coin: Codable {
    let name:   String? //= "Default"
    let symbol: String
}

因为某些索引不包含name

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47858723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档