美文网首页
Swift Json解析

Swift Json解析

作者: 静守幸福 | 来源:发表于2022-10-10 10:39 被阅读0次

起因: 之前一直用的HandyJSON,遇到了写异常的问题。在HandyJSON的GitHub发现了如下的说明

抱歉,现在已经不再建议继续使用。Swift发布4.0版本之前,官方未提供推荐的JSON处理方案,因此我们设计并实现了HandyJSON这套方案。但现在:1. Swift已经提供了Codable机制,可以相对便捷的进行JSON处理;2. HandyJSON的实现强依赖于Swift底层内存布局机制,这个机制是非公开、不被承诺、且实践证明一直在随着Swift版本变动的,HandyJSON需要跟进Swift的每次版本更新,更大的风险是,用户升级iOS版本可能会影响这个依赖,导致应用逻辑异常。综上,我们不再建议继续使用。

熟悉了下Codable,花时间把HandyJSON都换成了Codable

SwiftJSON推荐指南

遇到的问题记录

写了之后解析不出来,打印error.description 也得不到有用信息
解决方案: 直接打印error 会有一串描述信息,仔细找哪些键值出了问题
可能的问题 值的类型不对 键没有对应的值

改变键值的映射

let json = """
[
    {
        "product_name": "Bananas",
        "product_cost": 200,
        "description": "A banana grown in Ecuador."
    },
    {
        "product_name": "Oranges",
        "product_cost": 100,
        "description": "A juicy orange."
    }
]
""".data(using: .utf8)!

struct GroceryProduct: Codable {
    var name: String
    var points: Int
    var description: String?
    
    private enum CodingKeys: String, CodingKey {
        case name = "product_name"
        case points = "product_cost"
        case description
    }
}

let decoder = JSONDecoder()
let products = try decoder.decode([GroceryProduct].self, from: json)

print("The following products are available:")
for product in products {
    print("\t\(product.name) (\(product.points) points)")
    if let description = product.description {
        print("\t\t\(description)")
    }
}

相关文章

网友评论

      本文标题:Swift Json解析

      本文链接:https://www.haomeiwen.com/subject/kevcwrtx.html