Swift - JSON
如果App 需要有网络功能并且有一个后端服务器处理和返回数据的话,那就基本上无法避免和JSON
打交道了。在Swift 里处理JSON 其实是一件挺棘手
的事情,因为Swift 对于类型的要求非常严格,所以在解析完JSON 之后想要从结果的Any 中
获取某个键值是一件非常麻烦的事情。举个例子,我们使用JSONSerialization
解析完一个JSON 字符串
后,得到的是Any?
:
/* jsonString
{"menu": {"id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } }
}
*/let jsonString = "{\"menu\": {\"id\": \"file\", \"value\": \"File\", \"popup\": { \"menuitem\": [ {\"value\": \"New\", \"onclick\": \"CreateNewDoc()\"}, {\"value\": \"Open\", \"onclick\": \"OpenDoc()\"}, {\"value\": \"Close\", \"onclick\": \"CloseDoc()\"} ] } } }"let json = try? JSONSerialization.jsonObject(with: jsonString.data(using: .utf8, allowLossyConversion: true)!, options: .allowFragments)
print(json)
// 输出
// Optional({// menu = {// id = file;
// popup = {// menuitem = (
// {// onclick = "CreateNewDoc()";
// value = New;
// },
// {// onclick = "OpenDoc()";
// value = Open;
// },
// {// onclick = "CloseDoc()";
// value = Close;
// }
// );
// };
// value = File;
// };
//})
我们如果想要访问menu 里的popup 中第一个 menuitem 的value 值的话,在最正规的情况下,需要写这样的代码:
if let jsonDic = json as? [String: Any] {if let menu = jsonDic["menu"] as? [String: Any] {if let popup = menu["popup"] {if let popupDic = popup as? [String : Any] {if let menuItems = popupDic["menuitem"] {if let menuItemArr = menuItems as? [Any] {if let item0 = menuItemArr[0] as? [String : Any] {if let value = item0["value"] {print(value)}}}}}}}
}// 输出
// New
什么?你难道把这段代码看完了?我都不忍心写下去了,如果你真的想要坚持这么做的话,我只能说祝你好运了。
那么,我们应该怎么做呢?在上面的代码中,最大的问题在于我们为了保证类型的正确性
,做了太多的转换和判断
。我们并没有利用一个有效的JSON 容器
应该是字典或者数组
这个有用的特性
,而导致每次使用下标取得的值都是需要转换的An
y。如果我们能够重载下标
的话,就可以通过下标的取值配合Array
和Dictionary
的Optional Binding
来简单地在JSON 中取值
。感兴趣的可以移步看看json-swift 这个项目,它就使用了重载下标访问的方式简化了JSON 操作。使用这个工具,访问就简单多了。
Swift - JSON相关推荐
- iOS Swift JSON解析教程
In this tutorial, we will learn how to parse a JSON response in our iOS Application using Swift. We ...
- codable swift_使用Codable进行Swift JSON解析
codable swift In this tutorial, we'll be discussing the Codable Protocol and its forms in order to p ...
- Swift JSON与模型转换(HandyJSON封装)
2018.05.02 20:20:16字数 1,493阅读 5,017 一 简介 二 特性 三 安装使用以及封装 四 使用示例 五 总结 一 简介 HandyJSON是一个用于Swift语言中的JSO ...
- Swift JSON 教程:使用 JSON
原文:Swift JSON Tutorial: Working with JSON 作者:Luke Parham 译者:kmyhy 2017-1-15 更新说明:本教程由 Luke Parham 更新 ...
- Swift JSON转模型Xcode插件
SwiftJSONModeler是一个Xcode插件,一键转换json字符串为Swfit模型,一键转化 YApi 平台接口为模型,并且自动引入注释. 支持struct, class 支持单json转模 ...
- swift json
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...
- HandyJSON的swift json解析第三方使用教程
文章目录 安装方法 让模型遵守协议HandyJSON,嵌套模型的子模型也要继承HandyJSON 解析json数据 从json下一个子节点进行解析 解析数组 安装方法 podfile里面 pod 'H ...
- iOS Swift JSON转JSONString字符串
本人亲测有效!更多交流可以家魏鑫:lixiaowu1129,公重好:iOS过审汇总,一起探讨iOS技术! do{ let data = try? JSONEncoder().encode(jsonPr ...
- iOS开发之swift资料大全
目录(?)[+] 版本:Swift github排名 https://github.com/trending,github搜索:https://github.com/search 主要工作说明: 1 ...
最新文章
- Android系统shell中的clear命令实现
- html绘制圆形和弧形的代码,通过HTML5 Canvas API绘制弧线和圆形的教程
- oracle 导数据报exp00058_一文看懂oracle12c数据库跨小版本迁移
- .net 内嵌 GeckoWebBrowser (firefox) 核心浏览器
- idea没有git选项
- linux的静态编译elf无法调试,macos-运行arm-elf-gcc编译代码时出现段错误
- webuploader项目中多图片上传实例
- 微信支付接口详细步骤
- 化工虚拟仿真实验室实训操作软件搭建
- liteide+g:Goland多版本管理
- word方式编辑EPUB电子书
- 一次追踪h5游戏中google广告的经历
- P2142 高精度减法
- 鸿蒙系统更新支持哪些手机,已经发布的鸿蒙系统都支持哪些手机型号呢?快来看看你的手机支持不!...
- java高德地图api开发平台_【高德地图API】从零开始学高德JS API(一)地图展现...
- 前端基础 HTML 第九章 使用框架结构 ----暑假学习第五天
- 运维学习 unit 5 用户的建立与管理
- rip/eip/rbp/ebp
- 【二、八、十、十六】进制转换详解
- css+分散,【原】css实现两端对齐的3种方法