Swift 4.0 —— 一句代码完成json解析

   在日常的iOS 开发过程中,JSON的解析是一项没有什么技术含量又比较单调无聊的工作。用Objective-C或者Swift2.0/3.0把服务端下发的json解析成对象需要把json数据。比如在OC/Swift2.0/3.0中,只能把JSON数据解析成字典、数组等容器类型,再把字典根据kvc解析成具体的对象,如下图:


json数据解析成字典,再解析成User对象

    User对象中,需要用JSON字典对对象属性进行赋值,这就涉及到很多单调无脑的ctrl-v、ctrl-c 工作, 如果不小心key-value没有对上,还可能造成隐形的bug, debug起来也是一项枯燥的工作.


用json字典对User进行初始化

    一种解决的方法是用一些json解析的三方框架如TRON、Mantle等。Swift4.0也为我们提供了强大的JSON解析的API, 对象只要遵循Decodable协议,就可以用JSONDecoder把json数据解析成对象,但需要注意的是, json字典的key和对象的属性名必须一一对应,否则,就会解析失败,并提示:


json字典中没有key为bioText的值

    User中的bioText在json字典中对应的key为bio, JSONDecoder在解析时在json字典中找不到初始化User对象需要的bioText且User的bioText类型并不是optional,所以就无法初始化User对象,抛出了异常。一种解决json和对象属性名称不对应的方法是对象声明一个枚举类型的CodingKeys,指定json和对象属性名的对应关系,如下图:


声明CodingKeys

        CodingKeys告诉了JSONDecoder对象属性名对应的json字典的key,并用它初始化此属性。再次运行程序,发现user对象可以顺利被解析出来了。


成功解析出User对象

       通常Json的key都是采用下划线命名,而Objective-C和Swift采用的都是驼峰命名,对于Swift4.0, 只能采用CodingKeys把json的key和对象属性名进行对应,而Swift4.1提供了更强大的功能, 只要设置JSONDecoder的keyDecodingStrategy为.convertFromSnakeCase,就可以把下划线命名的key自动对应到驼峰命名的属性名,从此真的就是一句代码就可以完成json解析了!


下划线命名对应驼峰命名, swift 4.1

        JSONDecoder  还能进行嵌套解析、解析对象数组、对象字典等, 对于一些基本的业务场景来说,已经基本够用了。如下面的HomeDataSource, 其中包含了User类型的对象数组和Tweet类型的对象数组,JSONDecoder也可以用上面的方法解析出对应的users和tweets。


json数据解析成对象数组

    总结:Swift4.1提供了强大的JSON解析的API,大大的简化了开发者JSON解析的工作。在大多数业务场景下,系统提供的JSONDecoder已经够用了,希望大家可以在以后的开发过程中可以尝试使用JSONDecoder简化一些JSON解析的工作。

你可能感兴趣的:(Swift 4.0 —— 一句代码完成json解析)