当前位置: 首页 > wzjs >正文

网站设计与网页制作毕业论文百度云搜索引擎入口盘搜搜

网站设计与网页制作毕业论文,百度云搜索引擎入口盘搜搜,wordpress降级插件,福州网站营销HandyJSON 的优势 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, 应用广泛. 在 App 的使用过程中, 服务端给移动端发送的大部分都是 JSON 数据, 移动端需要解析数据才能做进一步的处理. 在解析JSON数据这一块, 目前 Swift 中流行的框架基本上是 SwiftyJSON, …

HandyJSON 的优势

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, 应用广泛. 在 App 的使用过程中, 服务端给移动端发送的大部分都是 JSON 数据, 移动端需要解析数据才能做进一步的处理. 在解析JSON数据这一块, 目前 Swift 中流行的框架基本上是 SwiftyJSON, ObjectMapper, JSONNeverDie, HandyJSON 这么几种.

我们应该如何选择呢?

首先我们应该先明白解析 JSON 的原理. 目前有两个方向.

保持 JSON 语义, 直接解析 JSON.
SwiftyJSON 就是这样的. 本质上仍然需要根据 JSON 结构去取值.

预定义 Model 类, 将 JSON 反序列化类的实例, 再使用这些实例.
这种方式和 OC 中的 MJExtension 的思路是一致的. 在 Swift 中, ObjectMapper, JSONNeverDie, 以及 HandyJSON 做的都是将 JSON 文本反序列化到 Model 类上.

第二种思路是我们熟悉和比较方便的. 和服务端定义好数据结构, 写好 Model 就可以直接解析.

第二种思路有三种实现方式:

完全沿用 OC 中的方式, 让 Model 类继承自 NSObject, 通过 class_copyPropertyList 方法拿到 Model 的各种属性, 从 JSON 中拿到对应的 value, 再通过 OC 中 利用runtime 机制 实现的 KVC 方法为属性赋值. 如 JSONNeverDie.
支持纯 Swift 类, 但要求开发者实现 mapping 函数, 使用重载的运算符进行赋值, 如 ObjectMapper.
获取到 JSON 数据后, 直接在内存中为实例的属性赋值. HandyJSON 就是这样实现的.
第一种方式的缺点在于需要强制继承 NSObject, 这不适用于 struct 定义的 Model. 因为 struct 创建的 Model 不能通过 KVC 为其赋值.
第二种方式的缺点在于自定义 mapping 函数, 维护比较困难.
第三种方式在使用上和 MJExtension 基本差不多, 比较方便. 是我们所推荐的.

HandyJSON 解析数据的原理.

如何在内存上为实例的属性赋值呢?
为属性赋值, 我们需要以下步骤:

获取到属性的名称和类型.
找到实例在内存中的 headPointer, 通过属性的类型计算内存中的偏移值, 确定属性在内存中的位置.
在内存中为属性赋值.
在 Swift 中实现反射机制的类是 Mirror, 通过 Mirror 类可以获取到类的属性, 但是不能为属性赋值, 它是可读的. 但是我们可以直接在内存中为实例赋值. 这是一种思路. 另外一种思路是不利用 Mirror, 直接在内存中获取到属性的名称和类型, 这也是可以的. 目前 HandyJSON 就是利用的第二种方式.

1. 核心原理:绕过反射,直接操作内存

传统的 JSON 库(如 ObjectMapper)依赖 Swift 的 Mirror 反射机制遍历模型属性,但反射存在性能瓶颈且无法直接修改属性值。HandyJSON 通过以下方式实现高效解析:

a. 利用类型元数据(Type Metadata)
  • Swift 编译器会为每个类型生成元数据,包含属性名称、类型、内存偏移量等信息。
  • HandyJSON 直接访问这些元数据,获取属性的名称内存位置,无需通过反射。
  • 例如,结构体的属性在内存中是连续排列的,通过元数据可以计算出每个属性的偏移量。
b. 内存拷贝与指针操作
  • 通过 UnsafeMutablePointer 直接操作模型实例的内存。

  • 将 JSON 值转换为目标类型后,直接写入对应的内存地址。

  • 示例代码逻辑:

    swift

    let offset = getPropertyOffset(from: metadata) // 获取属性偏移量
    let pointer = instancePointer + offset          // 计算属性内存地址
    let value = parseJSONValue(...)                // 解析 JSON 值
    pointer.storeBytes(of: value, as: type)         // 直接写入内存
    

2. 实现步骤详解

a. 类型元数据解析
  • 获取类型信息:通过 type(of:) 或泛型类型参数获取类型的元数据。
  • 解析属性列表:从元数据中提取属性名称、类型、是否为可选类型(Optional)等信息。
  • 处理继承和协议:遍历类型的继承链,确保父类属性也能被正确映射。
b. JSON 到内存的映射
  1. 解析 JSON:将 JSON 数据转换为字典([String: Any])。
  2. 匹配键与属性:将 JSON 的键与模型属性名匹配(支持自定义键名映射)。
  3. 类型转换:将 JSON 值转换为目标属性类型(如 String 转 Int、处理嵌套模型等)。
  4. 内存写入:通过指针将转换后的值写入模型实例的内存。
c. 特殊类型处理
  • 可选类型(Optional):根据 JSON 是否存在键值决定是否写入 nil
  • 枚举(Enum):将 JSON 值映射到枚举的 rawValue 或关联值。
  • 泛型类型:需要特殊处理元数据的动态解析。
http://www.dtcms.com/wzjs/109063.html

相关文章:

  • 代办公司注册条件广东宣布即时优化调整
  • 网站描述怎么修改百度竞价推广计划
  • 网站排名优化查询cps推广
  • 在线平面图设计seo网站优化案例
  • 做网站做什么公司好交换友情链接的平台有哪些
  • 违法的网址能注册做一网站用吗搜索引擎关键词优化技巧
  • 支付网站费怎么做会计分录友情链接交换系统
  • 武汉骑士网络做网站中央新闻频道直播今天
  • 谁做的怀来吧网站看广告收益的正规平台
  • 网站建设技术方面的论文广告推广 精准引流
  • 什么样的企业要做网站企业网络推广计划
  • 商丘市网站建设公司职业培训机构有哪些
  • 安装了lnmp怎么做网站上海网站营销推广
  • 网站做非经营性广告需备案安徽企业网站建设
  • 如何做彗聪网站呢seo搜索引擎优化实训报告
  • 做简历的什么客网站公司网址
  • 龙城建设网站公司网络推广视频
  • 微信微网站制作教程百度关键词优化推广
  • 网站制作联盟应用市场
  • 海淀区住房和城乡建设委员会官方网站网络广告营销成功案例
  • 西宁做腋臭哪里北大DE网站合肥seo排名优化
  • 查公司信息在哪里查网站推广和seo
  • 中国手工活加工网官网专业网站推广优化
  • 网站设计与规划作业如何交换友情链接
  • 购物网站建设 属于信息系统管理与设计么付费推广外包
  • 短视频变现的15种方法如何推广seo
  • 网站开发毕设设计论文seo营销网站的设计标准
  • 程序员 修电脑 做网站网络营销常用的工具
  • 网站程序开发后怎么上线专业的网站优化公司
  • 网站开发最合适的搭配网站快速排名公司