原理:

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

ObjC 利用反射和KVC实现嵌套对象序列化成JSON数据的更多相关文章

  1. C#将对象序列化成JSON字符串

    C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...

  2. 将Java对象序列化成JSON和XML格式

    1.先定义一个Java对象Person: public class Person { String name; int age; int number; public String getName() ...

  3. .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

    JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...

  4. 后台对象转化成json数据返回给前端

    一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据 二.下载jar依赖包:可以去这里下 ...

  5. 在.net core 的webapi项目中将对象序列化成json

    问题:vs2017 15.7.6创建一个基于.net core 2.1的webapi项目,默认生成的控制器继承自ControllerBase类 在此情况下无法使用Json()方法 将一个对象转成jso ...

  6. 对象序列化成Json字符串 及 反序列化成对象

    一. public static string JsonSerializer<T>(T t)        {            DataContractJsonSerializer ...

  7. C#实体对象序列化成Json并让字段的首字母小写的两种解决方法

    引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...

  8. C#实体对象序列化成Json,并让字段的首字母小写

    引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...

  9. 在C#中将对象序列化成Json格式

    在C#中将对象转换为Json格式的字符串. //匿名对象 var dataObj = new { Number = 1, Name = "Json" }; //将返回的时间格式解析 ...

随机推荐

  1. 极简Word排版示例(以Word2013为例)

    文档标题 第一行写下文档的名字,居中,微软雅黑字体,三号 章节标题 每一章的标题单独一行,光标选中这行,设置为标题1 每一节的标题单独一行,光标选中这行,设置为标题2 全部章节标题设置完毕后,下一步 ...

  2. python强大的区间处理库interval用法介绍

    原文发表在我的博客主页,转载请注明出处 前言 这个库是在阅读别人的源码的时候看到的,觉得十分好用,然而在网上找到的相关资料甚少,所以阅读了源码来做一个简单的用法总结.在网络的路由表中,经常会通过掩码来 ...

  3. Linux权限

    在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下. 语法如下: chmod [who] [+ | - | =] [mode] ...

  4. suggest插件实现下拉选择筛选

    实现的效果展示: 代码如下: 1.需要引入jquery,bootstrap-suggest.js,bootstrap.min.css 2.html页面代码: <!DOCTYPE html> ...

  5. RHEL每天定时备份Oracle

    步骤: (1)创建脚本文件bak_112.sh,内容如下(自动按当前日期备份数据库): #!/bin/sh export ORACLE_BASE=/u01/app/oracle; ORACLE_HOM ...

  6. [BZOJ1061][Noi 2008]志愿者招募(网络流)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1061 分析: 神题不解释,只能欣赏:https://www.byvoid.com/bl ...

  7. EditPlus v4.5 简体中文

    优秀的代码编辑器! 下载地址: EditPlus v4.00 build 465 简体中文汉化增强版 http://yunpan.cn/cVCSIZsKK7VFF    访问fe58 http://p ...

  8. dmesg 显示内核消息

    显示内核消息 dmesg [options] dmesg 可以用来显示存储在内核环缓冲区中的消息 系统启动时,内核会用硬件和模块初始化的相关消息填充其环缓冲区.内核环缓冲区中的消息常常用于诊断系统问题 ...

  9. 1017关于EXPLAIN的语法

    转自博客 http://blog.csdn.net/zhuxineli/article/details/14455029 explain显示了MySQL如何使用索引来处理select语句以及连接表.可 ...

  10. easyui-datagrid 报错:TypeError: col is null

    一般是由于设置的属性用到的列,如: idField:'aa', sortName:'bb' 等在 columns:[[{field:'cc',width:80,title:'列cc'}, {field ...