• 图解:习近平出席博鳌亚洲论坛2018年年会前瞻 2019-03-19
  • 外贸创新举措 让开放惠及世界 2019-03-15
  • 记者带你逛CES:体验未来科技 2019-03-14
  • 我的中国医改建议,彻底解决看病难看病贵 2019-03-14
  • 海空联合演练相关新闻 2019-01-05
  • 登录 立即注册
    金钱:

    广州快乐十分开奖记录

    广西福彩官网:轻量JSON对象转换库JSONCore

    [复制链接]
    来自: maintoco 分类: iOS精品源码 上传时间: 2016-12-25 10:59:22
    Tag:JSON , 转换 , 对象 , 数据类型 , JSONCore

    项目介绍:

    JSONCore

    广州快乐十分开奖记录 www.2hyn.net https://github.com/maintoco/JSONCore

    • A fast, convenient and nonintrusive conversion between JSON and model.

    • 转换速度快、使用简单方便的字典转模型框架

    水平有限,欢迎各位大牛批评指教

    • 一直是拿来主义用的第三方库,总是发现一些不灵活或者不足、不适用的地方,所以自己心血来潮写一个轻量的JSON对象转换库.

    • 目前为测试版,可能还有很多问题,会持续更新优化.

    • 不改变目标对象的属性类型

    • null值不做处理

    • 过滤类型不匹配的情况,例如类型为NSArray,但是JSON数据为字符串的情况

    • 待完善

    更新记录

    2016-12-24

    • 移除类继承的使用方式

    • 优化初始化方法

    • 修复JSON数据输出不能正确解析keyPath的问题,并增加是否格式化输出的开关

    2016-12-08

    • 增加NSDate支持

    • 修复类型不匹配的问题例如:属性定义为NSString但是JSON数据为Number


    JavaScript Object Notation, or [JSON][], is a lightweight, text-based, serialization format for structured data that is used by many web-based services and API's. It is defined by [RFC 4627][].

    JSON provides the following primitive types:

    • null

    • Boolean true and false

    • Number

    • String

    • Array

    • Object

    These primitive types are mapped to the following Objective-C Foundation classes:

    JSONObjective-C
    null[nil]
    true and false[NSNumber] or [BOOL]
    Number[NSNumber] or [NSDate]
    String[NSString]
    Array[NSArray]
    Object[NSDictionary]

    如何使用

    导入JSONCore文件夹到你的项目

    #import "NSObject+JSONCore.h"

    Examples【示例】

    创建基础模型YourBaseModel并封装【推荐】

    为了减少代码入侵,方便以后灵活迁移,可按以下方法封装
    示例:iOSExample->Weibo->Models->WeiboModel.h(包含MJExtension的实现方式作为对比)
    //示例基础模型
    @interface YourBaseModel : NSObject
    
    /**
     通过字典创建模型
     
     @param data 许可类型<NSData,NSDictionary,NSString>
     @return 新创建模型对象
     
     */
    + (instancetype)jsonObjectFromData:(id)data;
    + (NSArray *)arrayOfModelsFromDictionaries:(NSArray *)array;
    
    /**
     允许的属性名
     */
    + (NSArray *)allowedPropertyNames;
    
    /**
     key关联字段
     
     @return key:对象属性 value:keyPath
     */
    + (NSDictionary *)keyMappingDictionary;
    
    /**
     类型关联字典
     
     @return key:对象属性   value:类型class
     */
    + (NSDictionary *)typeMappingDictionary;
    
    /**
     忽略,不做处理的属性
     */
    + (NSSet *)ignoreSet;
    
    - (NSDictionary *)toDictionary;
    - (NSString *)toJSONString;
    
    @end
    
    #import "YourBaseModel.h"
    
    #import "NSObject+JSONCore.h"
    #import "MJExtension.h"
    
    @implementation YourBaseModel
    
    + (void)load {
         //格式化输出JSON数据
        [self setPrettyPrinted:YES];
    }
    
    #pragma mark - 封装JSONCore
    
    + (instancetype)jsonObjectFromData:(id)data {
        return [self co_objectFromKeyValues:data];
    }
    
    + (NSArray *)arrayOfModelsFromDictionaries:(NSArray *)array {
        return [self co_arrayOfModelsFromDictionaries:array];
    }
    
    + (NSArray *)allowedPropertyNames {
        return nil;
    }
    
    + (NSDictionary *)keyMappingDictionary {
        return nil;
    }
    
    + (NSDictionary *)typeMappingDictionary {
        return nil;
    }
    
    + (NSSet *)ignoreSet {
        return nil;
    }
    
    - (NSDictionary *)toDictionary {
        return [self co_toDictionary];
    }
    
    - (NSString *)toJSONString {
        return [self co_toJSONString];
    }
    
    #pragma mark JSONCoreConfig
    
    + (NSDictionary *)co_allowedPropertyNames {
        return nil;
    }
    
    + (NSDictionary *)co_keyMappingDictionary {
        return [self keyMappingDictionary];
    }
    
    + (NSDictionary *)co_typeMappingDictionary {
        return [self typeMappingDictionary];
    }
    
    + (NSSet *)co_ignoreDictionary {
        return [self ignoreSet];
    }
    
    @end
    

    JSONString -> Model【简单模型】

    { "id": 10, "country": "Germany", "dialCode": 49, "isInEurope": true }
    @interface CountryModel : YourBaseModel
    @property (nonatomic) NSInteger id;
    @property (nonatomic) NSString *country;
    @property (nonatomic) NSString *dialCode;
    @property (nonatomic) BOOL isInEurope;
    @end
    CountryModel *country = [CountryModel jsonObjectFromData:jsonString];

    JSONString -> Model【模型嵌套】

    {
        "orderId": 104,
        "totalPrice": 103.45,
        "products": [
            {
                "id": 123,
                "name": "Product #1",
                "price": 12.95
            },
            {
                "id": 137,
                "name": "Product #2",
                "price": 82.95
            }
        ],
        "status":{
            "code":1,
            "msg":"订单已付款"
        }
    }
    @interface ProductModel : YourBaseModel
    @property (nonatomic) NSInteger productId;
    @property (nonatomic) NSString *name;
    @property (nonatomic) float price;
    @end
    
    @interface OrderModel : YourBaseModel
    @property (nonatomic) NSInteger orderId;
    @property (nonatomic) float totalPrice;
    @property (nonatomic, assign) int status;
    @property (nonatomic) NSArray *products;
    @end

    Model name - JSON key mapping【属性和字典的key不同、多级映射】

    @implementation ProductModel
    + (NSDictionary *)keyMappingDictionary {
        return @{@"productID",@"id"};
    } 
    @end
    @implementation OrderModel
    + (NSDictionary *)keyMappingDictionary {
        return @{@"status":@"status.code"};
    } 
    @end

    Model contains model【模型中数组的元素也是模型】

    //模型中有个数组属性,数组元素映射为其他模型
    + (NSDictionary *)typeMappingDictionary {
        return @{@"products":[ProductModel class]};
    }

    解析速度对比

    测试数据

    100次循环解析平均耗时
    JSONCore0.283s
    MJExtension0.998s

    TODO

    • [已经完成] 解析速度对比分析

    • [ ] 复杂JSON解析测试

    • [ ] 全面覆盖测试,找出BUG

    code4app

    相关源码推荐:

    我来说两句
    *滑动验证:
    所有评论(10)
    kengsir 2016-12-26 09:51:33
    相当不错,感谢无私分享精神!
    回复
    BlueManlove 2016-12-26 09:53:47
    code4app确实是个好地方,必须支持~
    回复
    phoiu 2016-12-26 09:55:43
    写的真的很不错
    回复
    littleRed 2016-12-26 09:58:27
    code4app好的代码demo真的很多,谢谢啦~
    回复
    hellokenken 2016-12-26 10:01:44
    code4app好的代码demo真的很多,谢谢啦~
    回复
    AlonMessi 2016-12-26 10:10:44
    code4app确实是个好地方,必须支持~
    回复
    code4app热心网友 2016-12-26 12:00:09
    感谢分享,Code4App有你更精彩:)
    回复
    code4app热心网友 2016-12-27 09:30:08
    感谢分享,Code4App有你更精彩:)
    回复
    code4app热心网友 2016-12-27 09:38:26
    正需要啊,感谢楼主无私分享!
    回复
    12下一页
    提取码:  下载次数:7 状态:已购或VIP 售价:0(原价:10)金钱 下载权限:初级码农 
    827 0 7
    联系我们
    首页/微信公众账号投稿

    帖子代码编辑/版权问题

    QQ:435399051,742864542

    如何获得代码达人称号?

    代码贡献英雄榜
    用户名 下载数
    通过邮件订阅最新 Code4App 信息
    上一条 /4 下一条
    联系我们
    关闭
    合作电话:
    13802416937
    Email:
    [email protected]
    商务市场合作/投稿
    问题反馈及帮助
    联系我们

    广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|Github|申请友链|手机版|广州快乐十分开奖记录 ( 粤ICP备15117877号-1 )

    快速回复 广州快乐十分开奖记录 返回列表
  • 图解:习近平出席博鳌亚洲论坛2018年年会前瞻 2019-03-19
  • 外贸创新举措 让开放惠及世界 2019-03-15
  • 记者带你逛CES:体验未来科技 2019-03-14
  • 我的中国医改建议,彻底解决看病难看病贵 2019-03-14
  • 海空联合演练相关新闻 2019-01-05