【iOS】JSONModel的基本使用

news2024/11/20 3:20:08

文章目录

  • 前言
  • 一、导入JSONModel
  • 二、JSONModel的基本使用
    • 1.基本用法
    • 2.模型集合
    • 3.模型导出为NSDictionary或JSON
    • 4.设置所有属性可选(所有属性值可以为空)
    • 5.下划线(蛇式)转驼峰命名法


前言

JSONModel 是一个用于 Objective-C 的开源库,它用于简化 JSON 数据与 iOS 应用中的数据模型之间的转换。

其最主要的优点就是简化 JSON 数据解析与减少模型代码的编写,JSONModel可以将json数据直接映射到我们的对象中,对于我们获取的数据更加方便。同时对于模型的嵌套数据的获取更加便捷。


一、导入JSONModel

这里笔者在先前的博客中已经讲的很详细,不再赘述,详见【iOS】Cocoapods的安装以及使用


二、JSONModel的基本使用

单单讲解JSONModel理论知识过于抽象,笔者将会给出例子来对JSONModel进行讲解,JSONModel请求的网络数据的API如下:API
在这里插入图片描述

通过上图我们可以看到我们的Json数据共有三个字段,这三个字段就可以成为我们JSONModel类中的属性

1.基本用法

我们首先创建一个继承于JSONModel的TestModel,然后将字段作为该类中的属性

#import "JSONModel.h"
#import "Manager.h"
NS_ASSUME_NONNULL_BEGIN

//{
//    "status":1,
//    "msg":"【更新内容】\r\n\r\n★ 多图有标记 流量壕忽略\r\n★ 出门前离线 没网也能看\r\n★ 喜欢请好评 不喜快吐槽\r\n★ 萌妹工程师 邮箱在下面\r\nmua@zhihu.com\r\n(一般人我们不告诉他)",
//    "latest":"2.5"
//}

@interface TestModel : JSONModel

@property (nonatomic, assign) int status;
@property (nonatomic, copy) NSString *msg;
@property (nonatomic, copy) NSString *latest;

@end

NS_ASSUME_NONNULL_END

然后我们在进行网络请求时将我们请求到的数据导入到我们的Model中

    [manager GET:url parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        TestModel *testModel = [[TestModel alloc] initWithDictionary:responseObject error:nil];
        NSLog(@"%@", testModel);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"Error: %@", error);
    }];

然后我们打印的到了如下数据


2.模型集合

但是如果对于我们的Json数据中有着key的嵌套,那么就会这样输出就会出现一些问题

例如此时我们请求的json数据如下:

{
    "date":"20231018",
    "stories":[
        {
            "image_hue":"0xb3a27d",
            "title":"长平之战,廉颇主张防守,是对是错?",
            "url":"https:\/\/daily.zhihu.com\/story\/9766453",
            "hint":"众人皆醒我独醉 · 7 分钟阅读",
            "ga_prefix":"101807",
            "images":[
                "https:\/\/picx.zhimg.com\/v2-e3db2cb91bb097c111072487caf70737.jpg?source=8673f162"
            ],
            "type":0,
            "id":9766453
        },
        {
            "image_hue":"0x6d502d",
            "title":"不用化肥,如何让没有肥力的土地快速变得有肥?",
            "url":"https:\/\/daily.zhihu.com\/story\/9766437",
            "hint":"刘文龙PhD · 5 分钟阅读",
            "ga_prefix":"101807",
            "images":[
                "https:\/\/picx.zhimg.com\/v2-709e63e4a8870b25887454f4f587234b.jpg?source=8673f162"
            ],
            "type":0,
            "id":9766437
        },
        {
            "image_hue":"0x7c5b26",
            "title":"瞎扯 · 如何正确地吐槽",
            "url":"https:\/\/daily.zhihu.com\/story\/9766461",
            "hint":"VOL.3215",
            "ga_prefix":"101806",
            "images":[
                "https:\/\/picx.zhimg.com\/v2-924083b893973c3ae7d12b9c11155d8d.jpg?source=8673f162"
            ],
            "type":0,
            "id":9766461
        }
    ],
    "top_stories":[
        {
            "image_hue":"0xb3a27d",
            "hint":"作者 \/ 众人皆醒我独醉",
            "url":"https:\/\/daily.zhihu.com\/story\/9766453",
            "image":"https:\/\/picx.zhimg.com\/v2-b3b010976682ab3b7ba240c318e3cf9b.jpg?source=8673f162",
            "title":"长平之战,廉颇主张防守,是对是错?",
            "ga_prefix":"101807",
            "type":0,
            "id":9766453
        },
        {
            "image_hue":"0xb37229",
            "hint":"作者 \/ 匿名用户",
            "url":"https:\/\/daily.zhihu.com\/story\/9766426",
            "image":"https:\/\/pic1.zhimg.com\/v2-15928648a5270b506392f48a7eee2d8c.jpg?source=8673f162",
            "title":"你曾经被哪些自己所学专业的鬼畜知识震惊过?",
            "ga_prefix":"101707",
            "type":0,
            "id":9766426
        },
        {
            "image_hue":"0x3b3045",
            "hint":"作者 \/ 单长殷",
            "url":"https:\/\/daily.zhihu.com\/story\/9766350",
            "image":"https:\/\/pic1.zhimg.com\/v2-52190997fe05a0af480a2ae26c3775a9.jpg?source=8673f162",
            "title":"小事 · 哪些时刻让你体会到「知识的实用与浪漫」?",
            "ga_prefix":"101407",
            "type":0,
            "id":9766350
        }
    ]
}

Model属性如下:

//声明网络请求中要接受数据的两个协议
@protocol StoriesModel
@end

@protocol Top_StoriesModel
@end

#import "JSONModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface StoriesModel : JSONModel
@property (nonatomic, copy) NSString* image_hue;
@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* url;
@property (nonatomic, copy) NSString* hint;
@property (nonatomic, copy) NSString* ga_prefix;
@property (nonatomic, copy) NSString* type;
@property (nonatomic, copy) NSString* id;

@end

@interface Top_StoriesModel : JSONModel
@property (nonatomic, copy) NSString* image_hue;
@property (nonatomic, copy) NSString* hint;
@property (nonatomic, copy) NSString* url;
@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* ga_prefix;
@property (nonatomic, copy) NSString* type;
@property (nonatomic, copy) NSString* id;

@end

@interface TestModel3 : JSONModel
@property (nonatomic, copy) NSString *date;//三个同类型的
@property (nonatomic, copy) NSArray<StoriesModel>* stories;
@property (nonatomic, copy) NSArray<Top_StoriesModel>* top_stories;

@end

NS_ASSUME_NONNULL_END

注意:NSArray后的<>包含一个协议。这与OC泛型系统不同。它们不是相互排斥的,但是对于JSONModel来说,协议必须到位。

此时我们仍然直接打印我们的Model

    [manager GET:url parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        TestModel3 *testModel = [[TestModel3 alloc] initWithDictionary:responseObject error:nil];
        NSLog(@"%@", testModel);
        mainModelBolck(testModel);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"Error: %@", error);
    }];

出现如下结果:

<TestModel3> 
   [date]: 20231018
   [stories]: (
       "<StoriesModel> \n   [image_hue]: 0xb3a27d\n   [ga_prefix]: 101807\n   [id]: 9766453\n   [title]: \U957f\U5e73\U4e4b\U6218\Uff0c\U5ec9\U9887\U4e3b\U5f20\U9632\U5b88\Uff0c\U662f\U5bf9\U662f\U9519\Uff1f\n   [hint]: \U4f17\U4eba\U7686\U9192\U6211\U72ec\U9189 \U00b7 7 \U5206\U949f\U9605\U8bfb\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766453\n</StoriesModel>",
       "<StoriesModel> \n   [image_hue]: 0x6d502d\n   [ga_prefix]: 101807\n   [id]: 9766437\n   [title]: \U4e0d\U7528\U5316\U80a5\Uff0c\U5982\U4f55\U8ba9\U6ca1\U6709\U80a5\U529b\U7684\U571f\U5730\U5feb\U901f\U53d8\U5f97\U6709\U80a5\Uff1f\n   [hint]: \U5218\U6587\U9f99PhD \U00b7 5 \U5206\U949f\U9605\U8bfb\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766437\n</StoriesModel>",
       "<StoriesModel> \n   [image_hue]: 0x40312d\n   [ga_prefix]: 101807\n   [id]: 9766445\n   [title]: \U5982\U679c\U6c38\U751f\U4eba\U7c7b\U7ec6\U80de\U300c\U6d77\U62c9\U7ec6\U80de\U300d\U6cc4\U9732\U4e86\U4f1a\U6709\U5371\U9669\U5417\Uff1f\n   [hint]: \U567c\U91cc\U556a\U5566\U7830 \U00b7 1 \U5206\U949f\U9605\U8bfb\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766445\n</StoriesModel>",
       "<StoriesModel> \n   [image_hue]: 0x6d9c95\n   [ga_prefix]: 101807\n   [id]: 9766457\n   [title]: \U5fae\U8f6f\U7b97\U6cd5\U9762\U8bd5\U9898\U300c\U5224\U65ad\U9ebb\U5c06\U662f\U5426\U548c\U724c\U300d\U5e94\U8be5\U5982\U4f55\U505a\Uff1f\n   [hint]: \U8001\U987d\U7ae5 \U00b7 22 \U5206\U949f\U9605\U8bfb\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766457\n</StoriesModel>",
       "<StoriesModel> \n   [image_hue]: 0x7c5b26\n   [ga_prefix]: 101806\n   [id]: 9766461\n   [title]: \U778e\U626f \U00b7 \U5982\U4f55\U6b63\U786e\U5730\U5410\U69fd\n   [hint]: VOL.3215\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766461\n</StoriesModel>"
   )
   [top_stories]: (
       "<Top_StoriesModel> \n   [image_hue]: 0xb3a27d\n   [ga_prefix]: 101807\n   [id]: 9766453\n   [title]: \U957f\U5e73\U4e4b\U6218\Uff0c\U5ec9\U9887\U4e3b\U5f20\U9632\U5b88\Uff0c\U662f\U5bf9\U662f\U9519\Uff1f\n   [hint]: \U4f5c\U8005 / \U4f17\U4eba\U7686\U9192\U6211\U72ec\U9189\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766453\n</Top_StoriesModel>",
       "<Top_StoriesModel> \n   [image_hue]: 0xb37229\n   [ga_prefix]: 101707\n   [id]: 9766426\n   [title]: \U4f60\U66fe\U7ecf\U88ab\U54ea\U4e9b\U81ea\U5df1\U6240\U5b66\U4e13\U4e1a\U7684\U9b3c\U755c\U77e5\U8bc6\U9707\U60ca\U8fc7\Uff1f\n   [hint]: \U4f5c\U8005 / \U533f\U540d\U7528\U6237\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766426\n</Top_StoriesModel>",
       "<Top_StoriesModel> \n   [image_hue]: 0x2e6889\n   [ga_prefix]: 101607\n   [id]: 9766400\n   [title]: \U4e3a\U4ec0\U4e48\U6709\U300c\U597d\U5403\U300d\U7684\U8bf4\U6cd5\Uff0c\U6ca1\U6709\U300c\U574f\U5403\U300d\U7684\U8bf4\U6cd5\Uff1f\n   [hint]: \U4f5c\U8005 / \U591a\U90bb\U56fdDuolingo\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766400\n</Top_StoriesModel>",
       "<Top_StoriesModel> \n   [image_hue]: 0x8f8164\n   [ga_prefix]: 101507\n   [id]: 9766378\n   [title]: \U5c0f\U4e8b \U00b7 \U6709\U54ea\U4e9b\U8ba9\U4f60\U5fc3\U9178\U7684\U6545\U4e8b\Uff1f\n   [hint]: \U4f5c\U8005 / \U9ec4\U4e0d\U4f1a\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766378\n</Top_StoriesModel>",
       "<Top_StoriesModel> \n   [image_hue]: 0x3b3045\n   [ga_prefix]: 101407\n   [id]: 9766350\n   [title]: \U5c0f\U4e8b \U00b7 \U54ea\U4e9b\U65f6\U523b\U8ba9\U4f60\U4f53\U4f1a\U5230\U300c\U77e5\U8bc6\U7684\U5b9e\U7528\U4e0e\U6d6a\U6f2b\U300d\Uff1f\n   [hint]: \U4f5c\U8005 / \U5355\U957f\U6bb7\n   [type]: 0\n   [url]: https://daily.zhihu.com/story/9766350\n</Top_StoriesModel>"
   )
</TestModel3>

因为我们的StoriesModelTop_StoriesModel属于是被TestModel3嵌套的Model,因此我们直接打印TestModel3的对象时storiestop_stories中的数据时打印得到的是其并未转换为NSString的数据,而是Unicode 转义序列的字符串

如果我们想要得到里面的对象转换为字符串的数据,我们需要事先声明一个嵌套的Model属性

@property (nonatomic, copy)StoriesModel *t;

然后将大Model中的数组赋值给小Model

	TestModel3 *testModel = [[TestModel3 alloc] initWithDictionary:responseObject error:nil];
	self.t = testModel.stories[0];
	NSLog(@"%@", self.t);

打印得到:
在这里插入图片描述

我们的testModel中的两个NSArray中的对象类型是两个协议,这两个协议的作用是定义了数据模型的接口规范,以便 JSONModel
库知道如何将 JSON 数据映射到具体的对象
。通过采用这种方式,可以更灵活地定义数据模型对象,适应不同类型的数据,并在解析 JSON
数据时保持一致性。这使得你可以更容易地将 JSON 数据映射到相应的数据模型对象,以便在应用中使用这些数据。


3.模型导出为NSDictionary或JSON

ProductModel *pm = [ProductModel new];
pm.name = @"Some Name";

// convert to dictionary
NSDictionary *dict = [pm toDictionary];

// convert to json
NSString *string = [pm toJSONString];

4.设置所有属性可选(所有属性值可以为空)

设置所有属性可选的意义在于即使我们解析Json数据时即使返回为空也不会导致程序崩溃

@implementation TestModel3
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
    return YES;
}
@end

@implementation StoriesModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
    return YES;
}
@end

@implementation Top_StoriesModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
    return YES;
}

@end

但是官方建议尽量避免使用该方法(即使要全部属性为可选,也尽量是在每个属性那里标注为Optional)

@property (nonatomic, strong) NSString<Optional>* optionalProperty;

5.下划线(蛇式)转驼峰命名法

{
    "order_id": 104,
    "order_product": "Product #1",
    "order_price": 12.95
}
@interface OrderModel : JSONModel
@property (nonatomic) NSInteger orderId;
@property (nonatomic) NSString *orderProduct;
@property (nonatomic) float orderPrice;
@end

@implementation OrderModel

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

@end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Python 进行卡方测试

使用 Python 进行卡方测试 Python 中卡方特征测试的简单解释 奥坎耶尼根 跟随 发表于 迈向开发 4 分钟阅读 2月 2022&#xff0c; <> 18 1 土耳其超级联赛的三大足球俱乐部 一、说明 卡方检验用于检验为分类变量创建的模型。也就是说&#xff0c;这是我们在统计学中经…

Java】实现图片验证码2.0【详细代码】

实际开发过程中经常遇到要实现图片验证码来防止外部使用脚本刷接口&#xff0c;所以说图片验证码是很有必要的一个小功能。 下面这个之前发布的&#xff0c;现在发现生成的图片验证码是可以被自动化工具进行识别的&#xff0c;具有一定的安全性问题。 1.0版本验证码&#xff…

汽车零部件企业信邦控股之项目管理实践案例

信邦控股有限公司&#xff08;信邦控股&#xff09;为香港交易所主版上市公司&#xff0c;是惠州建邦精密塑胶有限公司的控股公司。信邦控股集团是国际化一站式表面处理专家&#xff0c;主要产品包括汽车内饰件、外饰件和双层挠性覆铜板&#xff0c;总部设于中国惠州。 信邦控股…

2023年中国熔盐储能装机量、新增装机量及行业投资规模分析[图]

熔盐储能是一种可以传递能量、长时间&#xff08;6-8h&#xff09;、大容量储能的技术路径&#xff0c;作为传热介质可以实现太阳能到热能的转换&#xff0c;作为储能介质可以实现将热能和电能的双向转换&#xff0c;可以很好的适应和解决以上两大矛盾。因此&#xff0c;熔盐储…

【面试题笔记】C++继承和多态常见高频经典面试题

1.继承相关习题 1.1 什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f; 菱形继承&#xff1a;菱形继承是多继承的一种特殊情况。两个中间类继承父类&#xff0c;而派生类继承了两个中间类&#xff0c;从而在继承关系上呈现出一种菱形。如下图所示&#xff1a; **…

jinkens编译不通过排查

gerrit上看编译不通过 打开 点开fulllog 然后 搜索 failed 关键字 或者error 都没有就看具体信息 就能找到原因了 此外碰到一个难以解决的问题 就是master分支本地编译没问题 push以后一直报错引用不到某个变量 最后发现是打开fulllog 发现其实报错的是其他的工程&…

openvino系列教程之人脸检测 mobilenetv2

OpenVINO&#xff08;开放式视觉推理和神经网络优化&#xff09;是英特尔推出的一款用于加速计算机视觉应用开发的软件。它基于英特尔的深度学习技术&#xff0c;提供了一套完整的工具链&#xff0c;包括模型优化器、运行时库等&#xff0c;帮助开发者快速实现高性能的计算机视…

火爆,接口测试+接口自动化测试整理总结,你不知道的都在这了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口自动化测试…

软件外包开发文档

编写软件开发文档是项目开发过程中的关键步骤&#xff0c;它有助于组织、记录和分享项目的信息和进展。以下是编写软件开发文档的一般步骤和建议&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.文档…

vue2 集成 Onlyoffice

缘起于进行了一次在线 Office 解决方案的调研&#xff0c;对比了 Office365、可道云、WPS Office、PageOffice 等厂商&#xff0c;最终敲定了使用 Onlyoffice&#xff0c;故整理了一份 Onlyoffice 从零开始系列教程&#xff0c;这是第一篇。 一、Onlyoffice 是什么&#xff1f…

虹科 | 解决方案 | 机械免拆压力测试方案

对于发动机的气门卡滞或气门开闭时刻错误、活塞环磨损、喷油嘴泄漏/堵塞等故障&#xff0c;往往需要解体发动机或拆卸部件才能发现&#xff1b;而对于某些轻微的故障&#xff0c;即使解体了发动机后也经常难于肉眼判别 虹科Pico提供的WPS500压力测试方案&#xff0c;可以动态测…

架构师日记-聊聊开发必掌握的那些实践技能 | 京东云技术团队

一 引言 尽管软件开发一直致力于追求高效、可读性强、易于维护的特性&#xff0c;但这些特性却像是一个不可能三角&#xff0c;相互交织&#xff0c;此消彼长。就像底层语言&#xff08;如汇编和C语言&#xff09;能够保持高效的运行性能&#xff0c;但在可读性和维护性方面却…

会议OA小程序【首页布局】

目录 一. Flex布局介绍 1.1 什么是Flex布局 1.2 基本概念 1.3 Flex属性 二. 会议OA首页轮播图的实现 配置 Mock工具 swiper 效果展示 三. 会议OA首页会议信息布局 index.js index.wxml index.wxss 首页整体效果展示 一. Flex布局介绍 布局的传统解决方案&#x…

LeetCode之买卖股票的最佳时机系列共6道题

文章目录 0 引言1 121. 买卖股票的最佳时机1. 1 暴力法1.2 一次遍历1.3 动态规划 2 122. 买卖股票的最佳时机 II2.1 一次遍历2.2 动态规划 3 123. 买卖股票的最佳时机 III3.1 动态规划 4 188. 买卖股票的最佳时机 IV4.1 动态规划 5 309. 买卖股票的最佳时机含冷冻期5.1 动态规划…

每日温度00

题目链接 每日温度 题目描述 注意点 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替1 < temperatures.length < 100000 解答思路 使用单调栈解决本题&#xff0c;思路为&#xff1a…

IEEE754 FP16

一. 实数的表达方法 1.定点数表示法 <整数部分>.<小数部分> 例. 666.66 2.浮点数表示法 科学计数法&#xff1a;有效数字基数&#xff08;base&#xff09;指数&#xff08;exponent&#xff09;正负符号位 规范化表示&#xff1a;d.ddd*β^e&#xff08;0&…

智能井盖的用处有哪些?好用在什么地方?

智能井盖是一种基于物联网技术的井盖系统&#xff0c;通过集成传感器、通信设备和数据处理功能&#xff0c;实现对井盖的实时监测、远程管理和智能化控制。WITBEE万宾的智能井盖传感器EN100-C2&#xff0c;只要在城市需要的井盖上面安装即可使用&#xff0c;一体式结构&#xf…

Python pip 替换国内镜像源

pip它还有一个非常好的特点&#xff0c;当你安装一个库的时候&#xff0c;它会自动帮你安装所有这个库的依赖库。完全一键式操作。非常方便。但是由于pipy网站是国外网站&#xff0c;很容易会被墙&#xff0c;导致经常下载速度非常慢&#xff0c;经常超时。 解决办法&#xff…

BSA研究方案——如何从容不迫的进行性状定位

&#xff08;一&#xff09;BSA基本概念 BSA即集群分离分析法&#xff0c;是Bulked-Segregant Analysis的首字母缩写。具体是利用差异目标性状的两个亲本构建家系&#xff0c;在子代分离群体中选取目标性状个体构建DNA混合池&#xff0c;采用高通量测序技术对混池DNA进行建库测…

在VScode中启动的前端项目关于 Local 和 Network 两个地址的区别

首先这两个地址在你的电脑上都是可以访问的 具体区别&#xff1a; localhost 是供当前电脑访问的地址&#xff0c;仅供你自己访问&#xff0c;其他人通过localhost 是访问不到你跑的项目的。你把 localhost 换成IP地址 127.0.0.1 也是相同的效果&#xff0c;因为 127.0.0.1 也…