解析 JSON 数据时出错(Swift 4 Playground)

Posted

技术标签:

【中文标题】解析 JSON 数据时出错(Swift 4 Playground)【英文标题】:Error when parsing JSON data (Swift 4 Playground) 【发布时间】:2018-05-18 05:02:41 【问题描述】:

我的 Swift Playground 不断返回

错误:无法读取数据,因为它不正确 格式。”

我不知道我做错了什么。下面是我的代码。

JSON 示例数据:


            "meta": 
                "name":"Tour of Honor Bonus Listing",
                "version":"18.1.4"
            ,
            "bonuses": [
            
            "bonusCode":"AZ1",
            "category":"ToH",
            "name":"Anthem Tour of Honor Memorial",
            "value":1,
            "city":"Anthem",
            "state":"AZ",
            "flavor":"Flavor Text Goes Here"
            
            ]
        

游乐场代码:

import Foundation
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

struct JsonFile: Codable 
    struct Meta: Codable 
        let name: String
        let version: String
    
    struct JsonBonuses: Codable 
        let bonusCode: String
        let category: String
        let name: String
        let value: Int
        let city: String
        let state: String
        let flavor: String
    
    let meta: Meta
    let bonuses: [JsonBonuses]



let url = URL(string: "http://www.tourofhonor.com/BonusData.json")!

URLSession.shared.dataTask(with: url)  data, response, error in
    if let error = error 
        print("Error: \(error.localizedDescription)")
        PlaygroundPage.current.finishExecution()
    
    guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else 
        print("Error: invalid HTTP response code")
        PlaygroundPage.current.finishExecution()
    
    guard let data = data else 
        print("Error: missing data")
        PlaygroundPage.current.finishExecution()
    

    // feel free to uncomment this for debugging data
    // print(String(data: data, encoding: .utf8))

    do 
        let decoder = JSONDecoder()
        let posts = try decoder.decode([JsonFile].self, from: data)

        print(posts.map  $0.meta.name )
        PlaygroundPage.current.finishExecution()
    
    catch 
        print("Error: \(error.localizedDescription)")
        PlaygroundPage.current.finishExecution()
    
    .resume()

我认为我的结构中有一些不正确的东西,但我不知道它是什么。

(这段是为了让提交工具开心,因为它说我代码太多,其他细节不够。显然直接简洁与提交扫描功能不兼容。

【问题讨论】:

【参考方案1】:

结构正确但根对象不是数组(去掉括号)

let posts = try decoder.decode(JsonFile.self, from: data)
print(posts.bonuses.map$0.name)

【讨论】:

如果我可以问一个后续问题:假设我想打印 JSON 文件的版本而不是奖励名称。当我将打印更改为print(posts.meta.map$0.version) 时,我收到一条错误消息,提示“'JsonFile.Meta' 类型的值没有成员'map'”。如果我从中删除.map,那么它会给出“无法调用非函数类型'JsonFile.Meta'的值” map 用于数组。由于键 meta 的值不是数组,因此您必须编写 print(posts.meta.version)

以上是关于解析 JSON 数据时出错(Swift 4 Playground)的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 2.0 中解析 JSON 时出错

在swift ios中解析NSJSON序列化中的json时出错

在 swift 4.0 中使用 Alamofire/SwiftyJSON 时出错

我在 Swift 5 上解码 json 时出错

在 swift 4 中使用可编码的 JSON 时出错?

使用 swift2 解析 json 并使用 NSJSONReadingOptions 出错