zoukankan      html  css  js  c++  java
  • ObjC 利用反射和KVC实现嵌套对象序列化成JSON数据

    原理:

    0.创建一个新的可变字典:NSMutableDictionary

    1.采用class_copyPropertyList函数遍历对象的属性

    2.property_getName获取属性名,valueForKey获取属性内容。

    3.判断该属性内容的Class:

    (1)假如为基础类型(NSString,NSNumber,NSNull),则直接返回,跳转到4操作。

    (2)假如为数组类型,先创建新的可变数组,再遍历旧数组中的内容,判断内容类型,重复3进行递归操作,直到找到基础类型。

        通过setObject atIndexedSubscript方法,把旧数组内容编码后转移到新可变数组,全部完成后把它返回给外层容器。

    (3)假如为字典类型,先创建新的可变字典,再遍历旧字典中的内容,判断内容类型,重复3进行递归操作,直到找到基础类型。

        通过setObject forKey方法,把旧字典里内容编码后转移到新可变字典,全部完成后把它返回给外层容器。

    4.对最外层可变数组容器,使用setObject forKey对所有属性进行赋值。

    PS:

    其实说白了,转JSON的过程只是把对象里的自定义成分转变成NSMutableArray或NSMutableDictionary(可变才能添加)的过程,因为他们都是按Key-Value编码的数据模型,所以只需要再通过一句话就能转成JSON的字符串了。

    这里用到Runtime是因为Runtime能按批遍历对象,否则你就要对不同对象按.xxx来访问他的属性,再setValue forKey到新字典。Runtime省了不少力。

    demo: https://github.com/rayshen/GIReflectionCodeDemo

  • 相关阅读:
    C#获取上级文件夹路径
    C#string与byte数组转行
    C#BAT与VBS文件的创建和执行调用
    C#生成条形码
    C#根据生日计算所属十二星座
    C#获取某一字符串第N到第N+1空格的字符
    WPF的DataGrid表格动态加载合并列
    WPF递归设置CheckBox与TextBox禁用联动
    WPF基础知识
    WPF Popup绑定目标控件上下左右位置
  • 原文地址:https://www.cnblogs.com/rayshen/p/5085473.html
Copyright © 2011-2022 走看看