如果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 容器应该是字典或者数组这个有用的特性,而导致每次使用下标取得的值都是需要转换的Any。如果我们能够重载下标的话,就可以通过下标的取值配合ArrayDictionaryOptional Binding 来简单地在JSON 中取值。感兴趣的可以移步看看json-swift 这个项目,它就使用了重载下标访问的方式简化了JSON 操作。使用这个工具,访问就简单多了。

Swift - JSON相关推荐

  1. iOS Swift JSON解析教程

    In this tutorial, we will learn how to parse a JSON response in our iOS Application using Swift. We ...

  2. codable swift_使用Codable进行Swift JSON解析

    codable swift In this tutorial, we'll be discussing the Codable Protocol and its forms in order to p ...

  3. Swift JSON与模型转换(HandyJSON封装)

    2018.05.02 20:20:16字数 1,493阅读 5,017 一 简介 二 特性 三 安装使用以及封装 四 使用示例 五 总结 一 简介 HandyJSON是一个用于Swift语言中的JSO ...

  4. Swift JSON 教程:使用 JSON

    原文:Swift JSON Tutorial: Working with JSON 作者:Luke Parham 译者:kmyhy 2017-1-15 更新说明:本教程由 Luke Parham 更新 ...

  5. Swift JSON转模型Xcode插件

    SwiftJSONModeler是一个Xcode插件,一键转换json字符串为Swfit模型,一键转化 YApi 平台接口为模型,并且自动引入注释. 支持struct, class 支持单json转模 ...

  6. swift json

    import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...

  7. HandyJSON的swift json解析第三方使用教程

    文章目录 安装方法 让模型遵守协议HandyJSON,嵌套模型的子模型也要继承HandyJSON 解析json数据 从json下一个子节点进行解析 解析数组 安装方法 podfile里面 pod 'H ...

  8. iOS Swift JSON转JSONString字符串

    本人亲测有效!更多交流可以家魏鑫:lixiaowu1129,公重好:iOS过审汇总,一起探讨iOS技术! do{ let data = try? JSONEncoder().encode(jsonPr ...

  9. iOS开发之swift资料大全

    目录(?)[+] 版本:Swift github排名 https://github.com/trending,github搜索:https://github.com/search 主要工作说明:  1 ...

最新文章

  1. Android系统shell中的clear命令实现
  2. html绘制圆形和弧形的代码,通过HTML5 Canvas API绘制弧线和圆形的教程
  3. oracle 导数据报exp00058_一文看懂oracle12c数据库跨小版本迁移
  4. .net 内嵌 GeckoWebBrowser (firefox) 核心浏览器
  5. idea没有git选项
  6. linux的静态编译elf无法调试,macos-运行arm-elf-gcc编译代码时出现段错误
  7. webuploader项目中多图片上传实例
  8. 微信支付接口详细步骤
  9. 化工虚拟仿真实验室实训操作软件搭建
  10. liteide+g:Goland多版本管理
  11. word方式编辑EPUB电子书
  12. 一次追踪h5游戏中google广告的经历
  13. P2142 高精度减法
  14. 鸿蒙系统更新支持哪些手机,已经发布的鸿蒙系统都支持哪些手机型号呢?快来看看你的手机支持不!...
  15. java高德地图api开发平台_【高德地图API】从零开始学高德JS API(一)地图展现...
  16. 前端基础 HTML 第九章 使用框架结构 ----暑假学习第五天
  17. 运维学习 unit 5 用户的建立与管理
  18. rip/eip/rbp/ebp
  19. 【二、八、十、十六】进制转换详解
  20. css+分散,【原】css实现两端对齐的3种方法

热门文章

  1. mysql字符集在哪设置_MySQL字符集设置
  2. 图解AI数学基础(2) | 概率与统计(要点速查清单·完结)
  3. 黑苹果 制作虚拟机CDR镜像(详细的教程,别再翻了!)
  4. 面试题库 之 数据结构与算法 100题
  5. 保存陌陌短视频到手机相册或电脑本地的方法
  6. Mysql 聚集索引和非聚集索引区别
  7. 全新ThihkPHP开发聚合支付系统兼容易支付系统网站源码
  8. 2019、2020年法定节假日整理 拿走点个赞好不好
  9. [激光原理与应用-44]:《焊接质量检测》-1- 焊接质量阶段性检测
  10. IC验证:静态时序分析