栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用Swift的Decodable解析一个仅知道或关心几个字段的任意JSON字符串?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用Swift的Decodable解析一个仅知道或关心几个字段的任意JSON字符串?

这个问题似乎是基于对“可分解的东西”如何工作的误解。为方便起见,Decodable愿意在幕后进行一些自动代码生成,以便您 可以
定义结构或结构嵌套,并仅解码整个JSON。但是您 不需要 利用它来解码JSON。

  • 无需为不需要的“字段”定义结构属性。如果JSON字典包含100个键,而您的对应结构仅包含一个属性,则没有问题;该密钥将被获取,没有其他密钥。

  • 关于“深度嵌套”部分,您应该花很多时间来编写简单的嵌套结构,这些结构执行潜水才能到达您真正关心的字典。但是,即使您不想这样做,也可以编写一个实现的

    init(from:)
    摘要,然后取出所需的值。

换句话说,如果您认为Decodable 主要
由的实现组成

init(from:)
,并学习编写所需的代码,则将看到可以用几行简单的代码行来解析此JSON。

举例来说,这是一个深层嵌套的信息的JSON草图,在每个层次上我们都忽略了很多额外的信息:

{  "ignore": true,  "outer1": {    "ignore": true,    "outer2": {      "ignore": true,      "outer3": {        "name": "matt",        "ignore": true      }    }  }}

我想做的是定义一个非常简单的struct Person,它仅由深层嵌套组成

name

struct Person : Decodable {    let name : String}

我可以做到的!为此,我自己实现了Decodable,提供了一个“
hoover”的CodingKey采用者结构和的实现

init(from:)
,这样(这看起来像很多工作,但不是,因为AnyCodingKey实现是样板化,复制并粘贴的)从这里开始,
init(prer:)
实现只是几行易于编写的代码):

    struct Person : Decodable {        let name : String        struct AnyCodingKey : CodingKey { var stringValue: String var intValue: Int? init(_ codingKey: CodingKey) {     self.stringValue = codingKey.stringValue     self.intValue = codingKey.intValue } init(stringValue: String) {     self.stringValue = stringValue     self.intValue = nil } init(intValue: Int) {     self.stringValue = String(intValue)     self.intValue = intValue }        }        init(from deprer: Deprer) throws { var con = try! deprer.container(keyedBy: AnyCodingKey.self) con = try! con.nestedContainer(keyedBy: AnyCodingKey.self, forKey: AnyCodingKey(stringValue:"outer1")) con = try! con.nestedContainer(keyedBy: AnyCodingKey.self, forKey: AnyCodingKey(stringValue:"outer2")) con = try! con.nestedContainer(keyedBy: AnyCodingKey.self, forKey: AnyCodingKey(stringValue:"outer3")) let name = try! con.depre(String.self, forKey: AnyCodingKey(stringValue:"name")) self.name = name        }    }

当我想深入研究JSON并获取

name
信息时,这很简单:

let person = try! JSonDeprer().depre(Person.self, from: json)

结果是一个带有

name
value 的Person对象
"matt"
。注意,我不必添加任何
ignore
键,也不需要嵌套结构。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/406878.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号