文档章节

JSONModel库的使用方法

 泊竹
发布于 2015/06/26 16:02
字数 779
阅读 234
收藏 0
点赞 0
评论 0

使用方法

1、基本类型/字符串/普通数组/字典/嵌套/可选

@interface  Test1Entity : JSONModel

@property (nonatomic, strong) NSString              *testString;
@property (nonatomic, assign) int                   testNumber;
@property (nonatomic, strong) NSArray<Optional>     *testArray;
@property (nonatomic, strong) NSDictionary          *testDictionary;
@property (nonatomic, strong) Test2Entity           *entity2;

@end

其中:

      Optional关键字表示testArray属性可以为空。当server端没有返回对应的数据时,忽略对它的解析。没有声明可选的属性,如果server端没有返回对应的数据,会引起crash。

      entity2是Test2Entity类型的属性,Test2Entity必须是JSONModel的子类。会自动嵌套解析直到全部遍历完。

调用:

Test1Entity *entity = [[Test1Entity alloc] initWithDictionary:@{@"testString"       :@"abc",
                                                                @"testNumber"       :@12,
                                                                @"testArray"        :@[@"1"],
                                                                @"testDictionary"   :@{@"key":@"value"},
                                                                @"entity2"          :@{@"testEnum":@2}
                                                                }
                                                        error:nil];
NSString *jsonString = [entity toJSONString];
NSDictionary *dict = [entity toDictionary];

其中:

      initWithDictionary:方法把传入的字典自动解析生成Entity。如果不特别设定,默认数据源的key和属性名相同。

      toJSONString方法把对象解析成JSONString,toDictionary方法把对象解析成字典。

2、枚举

typedef NS_ENUM(NSInteger, TestEnum) {
    TestENUM_1 = 0,
    TestENUM_2 = 1,
    TestENUM_3 = 2
};

@interface Test2Entity : JSONModel

@property (nonatomic, assign) TestEnum testEnum;

@end

调用:

Test2Entity *entity = [[Test2Entity alloc] initWithDictionary:@{@"testEnum":@2} error:nil];
NSString *jsonString = [entity toJSONString];

3、Guid

@interface Test3Entity : JSONModel

@property (nonatomic, strong) Guid *myId;

@end

调用:

Test3Entity *entity = [[Test3Entity alloc] initWithDictionary:@{@"myId":@"60165555201222841131397181021744"} error:nil];
NSString *jsonString = [entity toJSONString];

4、NSDate

@interface Test4Entity : JSONModel

@property (nonatomic, strong) NSDate    *myDate;

@end

调用:

Test4Entity *entity = [[Test4Entity alloc] initWithDictionary:@{@"myDate":@"2014-01-20 12:30:33"} error:nil];
NSString *jsonString = [entity toJSONString];

      对于NSDate属性的解析,已经自动做了本地时间和UTC时间的转换。当数据向对象转换,UTC - Local。当对象向数据转换,Local - UTC。

5、对象数组/延迟加载

      想要让一个数组内的对象自动解析,需要做一些特殊处理。

    1、需要在定义Entity的时候,定义一个与Entity同名的protocol。

    2、需要在定义数组属性时,声明这个protocol。

typedef NS_ENUM(NSInteger, TestEnum) {
    TestENUM_1 = 0,
    TestENUM_2 = 1,
    TestENUM_3 = 2
};

@protocol Test2Entity
@end

@interface Test2Entity : JSONModel

@property (nonatomic, assign) TestEnum testEnum;

@end
//--------------------------------------------------------------
@interface Test6Entity : JSONModel

@property (nonatomic, strong) NSArray<Optional, Test2Entity, ConvertOnDemand>  *entityArray;

@end

调用:

Test6Entity *entity = [[Test6Entity alloc] initWithDictionary:@{@"entityArray":@[@{@"testEnum":@2}, @{@"testEnum":@3}]} error:nil];
NSString *jsonString = [entity toJSONString];
NSDictionary *dict = [entity toDictionary];

6、server端返回数据的Key和Class的属性之间的对应关系设置

      默认情况下,会根据属性的名字去匹配返回数据的Key。如果类的属性名和返回数据的Key不相同,则需要通过手动指定来匹配。JSONModel库通过JSONKeyMapper类来记录这些对应关系。

      在JSONModel类中,有一个类方法+(JSONKeyMapper*)keyMapper;返回的JSONKeyMapper对象在JSONModel子类对象解析数据的时候被使用。

+(JSONKeyMapper *)keyMapper
{
    JSONKeyMapper *keyMapper = [[JSONKeyMapper alloc] initWithDictionary:@{@"ServerKey":@"ClassProperty"}];
    return keyMapper;
}

    每个JSONModel子类都这样弄会比较繁琐。当属性名和Key之间的对应关系是有一定规律时,可以使用JSONModel的另外几个类方法来快速设定。

1、Key首字母大写,属性名首字母小写

+(JSONKeyMapper *)keyMapper
{
    JSONKeyMapper *keyMapper = [JSONKeyMapper mapperFromUpperCaseToLowerCase];
    return keyMapper;
}

2、key首字母是下划线,后面和属性名相同

+(JSONKeyMapper *)keyMapper
{
    JSONKeyMapper *keyMapper = [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
    return keyMapper;
}


© 著作权归作者所有

共有 人打赏支持
粉丝 90
博文 67
码字总数 13285
作品 0
徐汇
iOS:JSON转OC属性小工具

iOS:JSON转OC属性小工具 在iOS开发中,只要有网络模块,就需要数据模型的编写。在进行数据模型的解析和映射时,JSONModel是一个非常常用且优秀的第三方框架,之前有有过博客对其分析,地址如...

珲少 ⋅ 06/09 ⋅ 0

JSON转化工具类--JSONParser

iOS数据转化组件 (JSONParser),支持JSON字符串、模型、字典、模型数组、字典数组之间相互的转化 为什么要写转化组件? 其实github上已经有很多优秀的JSON转化库,我见过SBJSON和JSONModel这两...

匿名 ⋅ 2016/03/31 ⋅ 0

iOS JSON 模型转换库评测

iOS 开发中总会用到各种 JSON 模型转换库,这篇文章将会对常见的几个开源库进行一下评测。评测的内容主要集中在性能、功能、容错性这几个方面。 评测的对象: Manually 手动进行 JSON/Model...

hejunbinlan ⋅ 2016/01/13 ⋅ 0

HTTP 请求封装库--YiNetwork

YiNetwork是一个的HTTP请求封装库,基于AFNetworking的AFHTTPSessionManager。 YiNetwork主要是一个基类库,主要是两个类YiBaseRequest和YiBaseModel. 之所以创建两个基类,是为了让各个请求...

flyicarus ⋅ 2015/10/28 ⋅ 0

IOS 字典模型互转框架 MJExtension

详细轻参考:https://github.com/CoderMJLee/MJExtension 功能很牛掰 能做什么? MJExtension是一套的超轻量级框架 MJExtension能完成的功能 --> --> --> --> 详尽用法主要参考 main.m中的各...

卧龙小 ⋅ 2015/04/07 ⋅ 1

pod install --no-repo-update 失败

erro log bogon:XXB(xcode_8release) (Before Import) zhongqihulian$ pod install --no-repo-update Analyzing dependencies Pre-downloading: from [!] Unable to satisfy the following r......

no_wait ⋅ 2016/11/25 ⋅ 0

处理网络API和模型对象的控制器--GQDataController

GQDataController是一种专门用于处理网络API和模型对象的控制器,你可以理解为MVVM或者MVC-N构架。 GQDataController使用AFNetworking的AFHTTPSessionManager处理网络请求,并将结果转换成模...

被山塞的骨头鱼 ⋅ 2016/08/01 ⋅ 0

Maven(六):Kaptcha的简单小例(二)

接上一篇: http://my.oschina.net/gently/blog/631765 (Kaptcha的简单小例(一)) 6. JsonModel.java: public class JsonModel<T> implements Serializable { private static final long......

牧羊人Berg ⋅ 2016/03/06 ⋅ 0

Swift项目兼容Objective-C问题汇总

本文是投稿文章,作者:一叶(博客) 欢迎将原创文章或者译文投给我们,投稿方式:support@cocoachina.com或者在首页点击“投稿爆料” 一、解决问题 Swift项目需要使用封装好的Objective-c组...

TomatosX ⋅ 2015/06/12 ⋅ 0

YYModel的介绍与使用

最近有时间就来看看之前一直想了解的YYModel,下面开始直奔主题。 介绍 iOS / OSX高性能模型框架。(YYmodel是来自组件YYKit) 性能 时间成本(过程GithubUser 10000次iPhone 6): 1-0.png Manu...

宵衣旰食 ⋅ 2016/11/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部