关于Json转model的一些小想法


1、json转model的核心设计思想就是使用runtime+递归的思想

runtime的思想:

第一步:取出类里面的所有成员变量

1、    Ivar* ivarList =class_copyIvarList(className, &count);

第二步:遍历ivarList,获取每个成员变量的名称和类型

   for(inti =0; i

        //根据下标获取成员变量

        Ivarvar = ivarList[i];

        //获取成员变量的名字

        NSString * propertyName = [NSString stringWithUTF8String:ivar_getName(var)];

        //获取成员变量的类型

        NSString * type = [NSString stringWithUTF8String:ivar_getTypeEncoding(var)];

        //去掉“_”方便取出dict中的数值

        NSString* dictKey = propertyName;

        if([propertyNamehasPrefix:@"_"]) {

            dictKey = [propertyNamestringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:@""];

        }

        //简化属性的数据类型

        if(![typeisEqualToString:@"f"]) {

            type = [typestringByReplacingCharactersInRange:NSMakeRange(0, 2) withString:@""];

            type = [typestringByReplacingCharactersInRange:NSMakeRange(type.length-1, 1) withString:@""];

        }


第三步:判断成员变量的类型

(1)如果是成员变量是NSString,NSNumber,float 等基本数据类型

则可以直接取出json里面的value赋值给model

(1)如果是成员变量是array

1、array包含的是基础的数据类型,则可以直接取出json里面的value赋值给model

2、array包含的是其他的自定义的model,这个时候则需要采用递归的方法


(2)如果是成员变量是dict这个时候也需要递归的方法


建议:创建模型的时候不要创建float,用NSnumber替换,使用float会出现进度不准确的问题

涉及到float类型数据计算的问题,建议将NSnumber转化成NSDecimalNumber,然后使用NSDecimalNumber提供的方法计算

Demo地址







最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 上面一篇文章没有分析完yymodel 。 接着上篇接着分析 static void ModelSetValueFo...
    充满活力的早晨阅读 1,118评论 0 0
  • 1、移动端遇到的兼容问题? 1 input框输入问题 最开始在input输入框中,也会习惯性的写上linehei...
    钟意_034a阅读 397评论 0 0
  • 字符串的操作:遍历字符串for c in str.characters{print(c)}字符串的拼接str3=s...
    super皮阅读 154评论 0 0
  • Swift导入框架直接使用:import 框架名称 定义一个标识符时必须制定该标识符是变量还是常量:let(常量)...
    super皮阅读 169评论 0 0
  • Redis Redis是一个支持网络、基于内存、可选持久性的NoSql数据库,目前在很多的系统中都使用了Redis...
    冰淇淋配什么呢阅读 1,124评论 0 0