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
ObjC 利用反射和KVC实现嵌套对象序列化成JSON数据的更多相关文章
- C#将对象序列化成JSON字符串
C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...
- 将Java对象序列化成JSON和XML格式
1.先定义一个Java对象Person: public class Person { String name; int age; int number; public String getName() ...
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...
- 后台对象转化成json数据返回给前端
一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据 二.下载jar依赖包:可以去这里下 ...
- 在.net core 的webapi项目中将对象序列化成json
问题:vs2017 15.7.6创建一个基于.net core 2.1的webapi项目,默认生成的控制器继承自ControllerBase类 在此情况下无法使用Json()方法 将一个对象转成jso ...
- 对象序列化成Json字符串 及 反序列化成对象
一. public static string JsonSerializer<T>(T t) { DataContractJsonSerializer ...
- C#实体对象序列化成Json并让字段的首字母小写的两种解决方法
引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...
- C#实体对象序列化成Json,并让字段的首字母小写
引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...
- 在C#中将对象序列化成Json格式
在C#中将对象转换为Json格式的字符串. //匿名对象 var dataObj = new { Number = 1, Name = "Json" }; //将返回的时间格式解析 ...
随机推荐
- ubuntu14.04禁用guest用户登录
打开终端(ctrl+alt+t) sudo echo -e "[SeatDefaults]\nallow-guest=false" > /usr/share/lightd ...
- U-boot与linux的关系
基本上没有啥关系,U-boot的话你也知道,说白了就像是Dos工具箱,本身算是个精简的Linux系统了,主要是负责硬件的初始化和引导,本身带有一些工具,作为引导程序,常作为嵌入式设备的引导.当真正的系 ...
- Theano2.1.2-基础知识之第一步:代数
来自:http://deeplearning.net/software/theano/tutorial/adding.html Baby Steps - Algebra 一.两个标量相加 在学习the ...
- 发布新博客皮肤red_autumnal_leaves
感谢sevennight为大家精心设计了一款博客皮肤——red_autumnal_leaves! [名称] red_autumnal_leaves[标题] 红叶[设计者] sevennight[简介] ...
- Libliner 中的-s 参数选择:primal 和dual
Libliner 中的-s 参数选择:primal 和dual LIBLINEAR的优化算法主要分为两大类,即求解原问题(primal problem)和对偶问题(dual problem).求解原问 ...
- android服务之启动方式
服务有两种启动方式 通过startService方法来启动 通过bindService来开启服务 布局文件 在布局文件中我们定义了四个按键来测试这两种方式来开启服务的不同 <?xml versi ...
- javascript位置相关知识点整理
1.css指定元素的位置采用的是文档坐标: 2.js查询元素位置的方法返回的是元素在视口中的位置,即视口坐标: 如何获得元素的位置和尺寸 获得元素的位置和尺寸可以通过getBoundingClient ...
- Jenkins+svn+maven
首先我们在我们的服务器上安装好svn和maven 这里在前两步骤基本上没有啥问题,主要就是在Jenkins的步骤我弄了好长时间,这里记录一下 Jenkins的问题我是在这个网址解决的:http://b ...
- jQuery报 SyntaxError: expected expression, got '<'错误
这有什么可奇怪的,这个问题是表达式未能按照预期结束,说白了就是你少写分号了. 你肯定是语法错了,仔细查看一下提示错误的那一行和它的附近,是不是因为疏忽大意出错了. 再给你的建议,不要觉得某个分号可以省 ...
- Android Studio插件安装及使用Genymotion模拟器
Android Studio自带的模拟器速度已经比Eclipse插件的快一点了,但是还不够暴力,不够爽.现在来说说最暴力的Genymotion模拟器如何结合AS 使用.首先上Genymotion官网下 ...