Swift 4使用Codable解码json [英] Swift 4 decoding json using Codable

查看:88
本文介绍了Swift 4使用Codable解码json的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以告诉我我在做什么错吗?我已经从这里如何使用Swift Decodable协议解码嵌套的JSON结构?,我发现了一个确实正是我需要的快速4可编码解码json

Can someone tell me what I'm doing wrong? I've looked at all the questions on here like from here How to decode a nested JSON struct with Swift Decodable protocol? and I've found one that seems exactly what I need Swift 4 Codable decoding json.

{
"success": true,
"message": "got the locations!",
"data": {
    "LocationList": [
        {
            "LocID": 1,
            "LocName": "Downtown"
        },
        {
            "LocID": 2,
            "LocName": "Uptown"
        },
        {
            "LocID": 3,
            "LocName": "Midtown"
        }
     ]
  }
}

struct Location: Codable {
    var data: [LocationList]
}

struct LocationList: Codable {
    var LocID: Int!
    var LocName: String!
}

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    let url = URL(string: "/getlocationlist")

    let task = URLSession.shared.dataTask(with: url!) { data, response, error in
        guard error == nil else {
            print(error!)
            return
        }
        guard let data = data else {
            print("Data is empty")
            return
        }

        do {
            let locList = try JSONDecoder().decode(Location.self, from: data)
            print(locList)
        } catch let error {
            print(error)
        }
    }

    task.resume()
}

我得到的错误是:


typeMismatch(Swift。 Array,Swift.DecodingError.Context(codingPath:
[],debugDescription:预期用于解码Array,但da
字典。,underlyingError:nil))

typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array but found a dictionary instead.", underlyingError: nil))


推荐答案

JSON文本的概述结构:

Check the outlined structure of your JSON text:

{
    "success": true,
    "message": "got the locations!",
    "data": {
      ...
    }
}

数据 的值是JSON对象 {...} ,它不是数组。
对象的结构:

The value for "data" is a JSON object {...}, it is not an array. And the structure of the object:

{
    "LocationList": [
      ...
    ]
}

对象只有一个条目 LocationList:[...] ,其值为数组 [...]

The object has a single entry "LocationList": [...] and its value is an array [...].

您可能还需要一个结构:

You may need one more struct:

struct Location: Codable {
    var data: LocationData
}

struct LocationData: Codable {
    var LocationList: [LocationItem]
}

struct LocationItem: Codable {
    var LocID: Int!
    var LocName: String!
}

用于测试...

var jsonText = """
{
    "success": true,
    "message": "got the locations!",
    "data": {
        "LocationList": [
            {
                "LocID": 1,
                "LocName": "Downtown"
            },
            {
                "LocID": 2,
                "LocName": "Uptown"
            },
            {
                "LocID": 3,
                "LocName": "Midtown"
            }
        ]
    }
}
"""

let data = jsonText.data(using: .utf8)!
do {
    let locList = try JSONDecoder().decode(Location.self, from: data)
    print(locList)
} catch let error {
    print(error)
}

这篇关于Swift 4使用Codable解码json的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆