【问题标题】:JSON Deserialization in SwiftSwift 中的 JSON 反序列化
【发布时间】:2014-06-08 18:47:39
【问题描述】:

在阅读了一些关于集合的内容后,我开始怀疑 json 反序列化是否会成为一个问题,因为集合需要为其包含的值指定类型。对于字典,需要同时指定键和值的类型。

经过一番实验,我发现以下工作:

let jsonString = "{\"bool\": true, \"num\": 1,\"string\": \"a string\"}"
let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

let json : AnyObject! = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil)

let valid = NSJSONSerialization.isValidJSONObject(json)

当我使用游乐场(或在 REPL 中)时,打印出 json 对象的内容时会得到以下信息:

["num": 1, "string": "a string", "bool": 1]

我的问题:有没有更好的方法来处理这个问题?

【问题讨论】:

  • 差不多就是这样,尽管我倾向于使用可选项而不是隐式展开(?而不是!)而且由于它是 AnyObject 的很多数组和字典,所以有很多转换正在进行.

标签: json deserialization swift


【解决方案1】:

HandyJSON 可以帮助您轻松处理 JSON。

您只需定义类,然后直接将 JSON 反序列化为它。喜欢:

class Animal: HandyJSON {
    var name: String?
    var id: String?
    var num: Int?

    required init() {}
}

let jsonString = "{\"name\":\"cat\",\"id\":\"12345\",\"num\":180}"

if let animal = JSONDeserializer<Animal>.deserializeFrom(jsonString) {
    print(animal)
}

玩得开心!

【讨论】:

    【解决方案2】:

    我建议多输入一些 json 对象:

    let json = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as? Dictionary<String, AnyObject?>
    

    这将帮助您通过键访问元素。

    【讨论】:

    • 无法将表达式的类型“$T4”转换为类型“Dictionary
    猜你喜欢
    • 2020-10-19
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多