【问题标题】:How to parse the Array of dictionaries using swift Unbox如何使用 swift Unbox 解析字典数组
【发布时间】:2017-06-28 11:48:14
【问题描述】:

我在我的项目中使用拆箱 (https://github.com/JohnSundell/Unbox.git) 进行对象映射我有一个问题,当它作为来自服务的数组时,我无法解析数据。例如,如果数据是下面的形式

[
    {
        "name": "Spotify",
        "id":"101"
    },
    {
        "name": "Netflix",
        "id":"102"
    }
]

从 Unboxer 获取异常,我们可以通过 Object mapper 映射 Array 对象吗?请帮帮我...

【问题讨论】:

  • 有什么异常?请出示您的代码。
  • 可能从服务器获取无效的 json 格式。使用在线 json 转换器检查您的真实数据一次jsoneditoronline.org
  • 你找到这个问题的答案了吗?
  • @lucasl 还没有,如果您有任何建议请告诉我
  • 能分享导致异常的代码吗?

标签: ios unbox


【解决方案1】:

Unbox 将您的 JSON 映射到结构或类,因此您必须有一个符合 Unboxable 协议的结构/类。例如:

struct Item: Unboxable {
    var id: String
    var name: String

    init(unboxer: Unboxer) throws {
        self.id = try unboxer.unbox(key: "id")
        self.name = try unboxer.unbox(key: "name")
    }
}

然后您可以像这样使用它(提供的 URL 为您的 JSON 示例提供服务):

let url = URL(string: "https://api.myjson.com/bins/o8b4t")

let task = URLSession.shared.dataTask(with: url!) { data, _, _ in
    if let data = data {
        if let items: [Item] = try? unbox(data: data) {
            print(items.count, items.first?.name)
            // Output: 2 Optional("Spotify")
        }
    }
}

task.resume()

对于原始字典或数组,IMO 没有必要为此使用 Unbox,只需使用 JSONSerialization.jsonObject(with:),如下所示:

let url = URL(string: "https://api.myjson.com/bins/o8b4t")

let task = URLSession.shared.dataTask(with: url!) { data, _, _ in
    if let data = data {
        if let parsed = (try? JSONSerialization.jsonObject(with: data)) as? [[String: String]] {
            print(parsed.count, parsed.first?["name"])
            // Output: 2 Optional("Spotify")
        }
    }
}

task.resume()

注意:在现实世界中,您更喜欢捕获抛出的异常(如果有的话)。

【讨论】:

    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 2020-01-22
    • 2018-01-05
    • 2016-07-25
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    相关资源
    最近更新 更多