OC_YYModel字典转模型的几种详细用法

目录

  • JSON转字符串
  • 普通字典转模型
  • 模型属性有自定义的模型YYUSer
  • 属性有数组(数组里自定义模型),还有字典和集合
  • 字典里的key与模型里的属性名不一致

常用的几个方法:

# json转模型
+ (instancetype)yy_modelWithJSON:(id)json;

# 模型转字符串
- (NSString *)yy_modelToJSONString 

# 字典转模型
+ (instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary ;

# 声明数组、字典或者集合里的元素类型时要重写
+ (nullable NSDictionary<NSString *, id> *)modelContainerPropertyGenericClass;

# 字典里的key值与模型的属性值不一致要重复
+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper;

# 下面两者是属性值在两个dic与模型之间的转化方法(自己看代码吧~😂)
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic ;
- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic;

代码演示和转模型注释:
一、JSON转字符串
执行代码:

// JSON ->模型 (内部实现:json -> 字典 -> 模型)
YYBook *book = [YYBook yy_modelWithJSON:@"     \
                {                                           \
                \"name\": \"Harry Potter\",              \
                \"pages\": 512,                          \
                \"publishDate\": \"2010-01-01\"          \
                }"];
//模型 -> 字符串
NSString *bookJSON = [book yy_modelToJSONString];
NSLog(@"Book: %@", bookJSON);

****二、普通字典转模型****
模型代码:

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) uint64_t pages;
@property (nonatomic, strong) NSDate *publishDate;

执行代码:

 NSDictionary *dic = @{
                          @"name": @"Harry Potter",
                          @"pages": @(512),
                          @"publishDate": @"2010-01-01"
                          };
YYBook *book1 = [YYBook yy_modelWithDictionary:dic];
NSString *bookJSON1 = [book1 yy_modelToJSONString];
NSLog(@"bookJSON: %@",bookJSON1);

****三、模型属性有自定义的模型YYUSer****
模型代码:

@property (nonatomic, assign) uint64_t rid;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSDate *createTime;
@property (nonatomic, strong) YYUser *owner;  #自定义模型

执行代码:

NSDictionary *dic = @{
                      @"rid": @(123456789),
                      @"name": @"YYKit",
                      @"createTime" : @"2011-06-09T06:24:26Z",
                      @"owner": @{
                              @"uid" : @(989898),
                              @"name" : @"mawenxing"
                              }
                      };

YYRepo *repo1 = [YYRepo yy_modelWithDictionary:dic];
NSLog(@"Repo1: %@\nowner.name=%@", repo1.name,repo1.owner.name);

****四、属性有数组属性里有数组(数组里自定义模型),还多字典和集合****
模型代码:

# YYAlbum.h
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSArray *photos; # Array<YYPhoto>
@property (nonatomic, strong) NSDictionary *likedUsers; # Key:name(NSString) Value:user(YYUser)
@property (nonatomic, strong) NSSet *likedUserIds; # Set<NSNumber>

# YYPhoto.h
@property (nonatomic, copy) NSString *url;
@property (nonatomic, copy) NSString *desc;

# YYAlbum.m
#把数组里面带有对象的类型专门按照这个方法,这个格式写出来
-(nullable NSDictionary<NSString *, id> *)modelContainerPropertyGenericClass{
    return @{
             @"photos"       : YYPhoto.class,
             @"likedUsers"   : YYUser.class,
             @"likedUserIds" : NSNumber.class
             };
}

执行代码:

///源代码这里有些成字典的,大家如果看不懂这个JSON可以看字典
YYAlbum *album = [YYAlbum yy_modelWithJSON:@"          \
                      {                                                   \
                      \"name\" : \"Happy Birthday\",                      \
                      \"photos\" : [                                      \
                      {                                               \
                      \"url\":\"http://example.com/1.png\",       \
                      \"desc\":\"Happy~\"                         \
                      },                                              \
                      {                                               \
                      \"url\":\"http://example.com/2.png\",       \
                      \"desc\":\"Yeah!\"                          \
                      }                                               \
                      ],                                                  \
                      \"likedUsers\" : {                                  \
                      \"Jony\" : {\"uid\":10001,\"name\":\"Jony\"},   \
                      \"Anna\" : {\"uid\":10002,\"name\":\"Anna\"}    \
                      },                                                  \
                      \"likedUserIds\" : [10001,10002]                    \
                      }"];
    NSString *albumJSON = [album yy_modelToJSONString];
    NSLog(@"Album: %@", albumJSON);

****五、字典里的属性名与模型里的属性名不一致****
模型代码:

# YYMessage.h
@property (nonatomic, assign) uint64_t messageId;
@property (nonatomic, strong) NSString *content;
@property (nonatomic, strong) NSDate *time;

# YYMessage.m
/*!
 *  1.该方法是 `字典里的属性Key` 和 `要转化为模型里的属性名` 不一样 而重写的
 *  前:模型的属性   后:字典里的属性
 */

+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper{

    return @{@"messageId":@"i",
             @"content":@"c",
             @"time":@"t"};
}

/*!
 *  2. 下面的两个方法 `字典里值`与`模型的值`类型不一样`需要转换`而重写的方法
 *   NSDate *time     dic[@"t"]是double类型的的秒数
 */

/// Dic -> model
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {

    self.time = (NSDate *)[NSDate dateWithTimeIntervalSince1970:[dic[@"t"] doubleValue]/1000];

    return YES;
}

/// model -> Dic
- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {

    dic[@"t"] = @([self.time timeIntervalSince1970] * 1000).description;

    return YES;
}

执行代码:

/*!
 *  第一种:字典版
 */
NSDictionary *dic = @{@"i":@2000000001,
                      @"c":@"Hello",
                      @"t":@1437237598000};

YYMessage *message = [YYMessage yy_modelWithDictionary:dic];


NSString *messageJSON = [message yy_modelToJSONString];

NSLog(@"messageJSON: %@", messageJSON);

/*!
 *  第二种:JSON版
 */
YYMessage *message = [YYMessage yy_modelWithJSON:@"{\"i\":\"2000000001\",\"c\":\"Hello\",\"t\":\"1437237598000\"}"];
NSString *messageJSON = [message yy_modelToJSONString];
NSLog(@"messageJSON: %@", messageJSON);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 演示代码地址:https://github.com/codeWillwillCode/LearnMJExtensi...
    __微凉阅读 21,930评论 33 200
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,907评论 25 707
  • 比尔·盖茨的一句话—— “我们总是高估短期能够做到的,而低估五年或者十年中能够做到的。” 类似的格言还有一句—— ...
    驭临风阅读 244评论 0 1
  • 1.从个人中心到订单查询 2.取消订单 3.管理员添加车次
    Plague_Ins阅读 186评论 0 0