iOS开发-JsonModel的学习及使用

这篇具有很好参考价值的文章主要介绍了iOS开发-JsonModel的学习及使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

IOS JsonModel的学习及使用

当我们从服务端获取到json数据后的时候,我们需要在界面上展示或者保存起来,下面来看下直接通过NSDictionary取出数据的情况。

NSDictionary直接取出数据的诟病。

    NSString *name = [self.responseObj objectForKey:@"name"];
    NSString *gender = [self.responseObj objectForKey:@"gender"];
    NSString *sign = [self.responseObj objectForKey:@"sign"];
    NSString *avatar = [self.responseObj objectForKey:@"avatar"];
    NSString *phone = [self.responseObj objectForKey:@"phone"];
    NSString *token = [self.responseObj objectForKey:@"token"];

从以上的代码,我们能够看出,取出数据相当繁琐的。为了防止显示及出现crash等问题,还需要判断值的nil,null,类型等情况的出现。
所以我们需要使用到JSONModel。

简介JSONModel

JSONModel - 神奇的JSON数据建模框架 https://github.com/jsonmodel/jsonmodel
JSONModel可以快速创建智能数据模型。你可以在你的iOS,MacOS和watchOS和tvOS应用程序使用它。自动将JSON转成你的模型类,大大减少你需要编写的代码量。

见http://www.laileshuo.com/?p=669查看关于更改的详细信息。

iOS开发-JsonModel的学习及使用,移动开发,iphone开发,Objective-c,ios,学习,cocoa (图片来源于网络)

JSONModel安装(Installation)

  • 使用CocoaPods安装,在podfile,添加一下内容,之后使用pod update更新
    pod 'JSONModel'

  • 使用Carthage安装
    github "jsonmodel/jsonmodel"

JSONModel使用手册(Manual)

  • 下载JSONModel库
  • 复制JSONModel子文件夹到您的Xcode项目
  • 添加SystemConfiguration.framework库

JSONModel基础用法(Basic Usage)

假设你的JSON格式是这样的:

    { "id": 10, "country": "Germany", "dialCode": 49, "isInEurope": true }

  • 创建一个JSONModel的子类
  • 在.h头文件中声明一些以json的key命名的属性
   @interface CountryModel : JSONModel
   @property (nonatomic) NSInteger id;
   @property (nonatomic) NSString *country;
   @property (nonatomic) NSString *dialCode;
   @property (nonatomic) BOOL isInEurope;
   @end

之后我们没有必要在.m文件中多做什么特殊的处理。

初始化数据模型:

   NSError *error;
   CountryModel *country = [[CountryModel alloc] initWithString:myJson error:&error];

如果验证JSON通过的话,将会通过json中的key的value值为CountryModel的id,country,dialCode,isInEurope的属性赋值。并且自动匹配相遇的类型。

实例

自动根据名称映射

   {
    "id": 123,
    "name": "Product name",
    "price": 12.95
   }

   @interface ProductModel : JSONModel
   @property (nonatomic) NSInteger id;
   @property (nonatomic) NSString *name;
   @property (nonatomic) float price;
   @end

模型嵌套 (模型包含其他模型)

   {
    "orderId": 104,
    "totalPrice": 13.45,
    "product": {
        "id": 123,
        "name": "Product name",
        "price": 12.95
    }
   }

   @interface ProductModel : JSONModel
   @property (nonatomic) NSInteger id;
   @property (nonatomic) NSString *name;
   @property (nonatomic) float price;
   @end

   @interface OrderModel : JSONModel
   @property (nonatomic) NSInteger orderId;
   @property (nonatomic) float totalPrice;
   @property (nonatomic) ProductModel *product;
   @end

模型集合collections

   {
    "orderId": 104,
    "totalPrice": 103.45,
    "products": [
        {
            "id": 123,
            "name": "Product #1",
            "price": 12.95
        },
        {
            "id": 137,
            "name": "Product #2",
            "price": 82.95
        }
    ]
  }

   @protocol ProductModel;

   @interface ProductModel : JSONModel
   @property (nonatomic) NSInteger id;
   @property (nonatomic) NSString *name;
   @property (nonatomic) float price;
   @end

   @interface OrderModel : JSONModel
   @property (nonatomic) NSInteger orderId;
   @property (nonatomic) float totalPrice;
   @property (nonatomic) NSArray <ProductModel> *products;
   @end

注:NSArray的后尖括号包含的协议。这是不一样的目标C泛型系统。它们不是相互排斥的,而是为JSONModel工作,该协议必须到位。

嵌套键映射

   {
    "orderId": 104,
    "orderDetails": [
        {
            "name": "Product #1",
            "price": {
                "usd": 12.95
            }
        }
    ]
  }


@interface OrderModel : JSONModel
@property (nonatomic) NSInteger id;
@property (nonatomic) NSString *productName;
@property (nonatomic) float price;
@end

@implementation OrderModel

+ (JSONKeyMapper *)keyMapper
{
    return [[JSONKeyMapper alloc] initWithModelToJSONDictionary:@{
        @"id": @"orderId",
        @"productName": @"orderDetails.name",
        @"price": @"orderDetails.price.usd"
    }];
}

@end

自动映射到snake_case

{
    "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 mapperForSnakeCase];
}

@end

可选属性Optional (就是说这个属性可以为null或者为空)

{
    "id": 123,
    "name": null,
    "price": 12.95
}

@interface ProductModel : JSONModel
@property (nonatomic) NSInteger id;
@property (nonatomic) NSString <Optional> *name;
@property (nonatomic) float price;
@property (nonatomic) NSNumber <Optional> *uuid;
@end

忽略属性 Ignored (就是JSONModel完全忽略这个属性)

{
    "id": 123,
    "name": null
}

@interface ProductModel : JSONModel
@property (nonatomic) NSInteger id;
@property (nonatomic) NSString <Ignore> *customProperty;
@end

设置标量类型可选optional

{
    "id": null
}

@interface ProductModel : JSONModel
@property (nonatomic) NSInteger id;
@end

@implementation ProductModel

+ (BOOL)propertyIsOptional:(NSString *)propertyName
{
    if ([propertyName isEqualToString:@"id"])
        return YES;

    return NO;
}

@end

将model转成json

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

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

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

特定类型数据转换

@interface JSONValueTransformer (CustomNSDate)
@end

@implementation JSONValueTransformer (CustomTransformer)

- (NSDate *)NSDateFromNSString:(NSString *)string
{
    NSDateFormatter *formatter = [NSDateFormatter new];
    formatter.dateFormat = APIDateFormat;
    return [formatter dateFromString:string];
}

- (NSString *)JSONObjectFromNSDate:(NSDate *)date
{
    NSDateFormatter *formatter = [NSDateFormatter new];
    formatter.dateFormat = APIDateFormat;
    return [formatter stringFromDate:date];
}

@end

自定义 getters/setters

@interface ProductModel : JSONModel
@property (nonatomic) NSInteger id;
@property (nonatomic) NSString *name;
@property (nonatomic) float price;
@property (nonatomic) NSLocale *locale;
@end

@implementation ProductModel

- (void)setLocaleWithNSString:(NSString *)string
{
    self.locale = [NSLocale localeWithLocaleIdentifier:string];
}

- (void)setLocaleWithNSDictionary:(NSDictionary *)dictionary
{
    self.locale = [NSLocale localeWithLocaleIdentifier:dictionary[@"identifier"]];
}

- (NSString *)JSONObjectForLocale
{
    return self.locale.localeIdentifier;
}

@end

自定义验证JSON

@interface ProductModel : JSONModel
@property (nonatomic) NSInteger id;
@property (nonatomic) NSString *name;
@property (nonatomic) float price;
@property (nonatomic) NSLocale *locale;
@property (nonatomic) NSNumber <Ignore> *minNameLength;
@end

@implementation ProductModel

- (BOOL)validate:(NSError **)error
{
    if (![super validate:error])
        return NO;

    if (self.name.length < self.minNameLength.integerValue)
    {
        *error = [NSError errorWithDomain:@"me.mycompany.com" code:1 userInfo:nil];
        return NO;
    }

    return YES;
}

@end

如果您需要查看详情JSONModel的使用请访问https://github.com/jsonmodel/jsonmodel ,以便下载最新代码进行研究使用。

学习记录,每天不停进步。文章来源地址https://www.toymoban.com/news/detail-644306.html

到了这里,关于iOS开发-JsonModel的学习及使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iPhone & iPad 移动端使用 Obsidian

    「原理」:Working Copy 可以实现 Git 仓库拉取和文件同步的功能。Obsidian Git 可以实现文件系统的同步与更新。iOS 本身不具备 Git 功能,通过 Working Copy 可以克隆仓库并生成软连接。 前提条件:在电脑端已经创建好 Obsidian 仓库,并使用 Obsidian Git 插件将笔记目录推送到 Github 远端

    2024年02月11日
    浏览(69)
  • iPhone开发--Xcode15下载iOS 17.0.1 Simulator Runtime失败解决方案

    爆句粗口,升级后公司网络下载iOS 17.0.1 Simulator Runtime一直出错,每次出错后都得重新开始下载,oh,f**k。上一次在在家里的网络升级成功。 进入网址:https://developer.apple.com/download/all/ 之后找到iOS 17.0.1 Simulator Runtime,点击下载,这个通过浏览器下载。 之后在命令行运行下面的

    2024年02月08日
    浏览(62)
  • 如何开发移动应用:iOS和Android的比较

    移动应用开发领域一直以来都备受关注,而iOS和Android作为两大主要的移动操作系统,各自拥有强大的生态系统和开发工具。在本文中,我们将比较iOS和Android移动应用开发的关键方面,以帮助开发者选择合适的平台,或者了解在不同平台上开发应用时需要考虑的因素。 iOS iO

    2024年02月07日
    浏览(52)
  • 使用WinRa1n越狱iOS 16.7版本,支持iPhone 5s ~ X

    WinRa1n是由iKeystools团队开发的一款越狱工具,支持IOS 12.2 ~ 16.7直接越狱,完全的Windows平台,使用简单,操作容易上手,完全有必要单独写一篇文章。 支持的三种越狱模式: 1, CheckM8  支持引导未签名的img4文件,说明白就是进入Pwndfu模式。新手用不上。 2, Checkra1n 0.12.4  是我

    2024年02月04日
    浏览(423)
  • 移动开发最佳实践:为 Android 和 iOS 构建成功应用的策略

    您可以将本文作为指南,确保您的应用程序符合可行的最重要标准。请注意,这份清单远非详尽无遗;您可以加以利用,并添加一些自己的见解。 要制作一个成功的应用程序,你需要了解你是为谁制作的。从创建用户角色开始–基于人口统计、行为模式、动机和目标,对理想

    2024年02月13日
    浏览(52)
  • [AudioRecorder]iPhone苹果通话录音汉化破解版-使用巨魔安装-ios17绕道目前还不支持

    首先你必须有 巨魔 才能使用!! 不会安装的,还没安装的 移步这里 ,ios17 以上目前装不了,别看了:永久签名 | 网址分类目录 | 路灯iOS导航-苹果签名实用知识网址导航-各种iOS技巧-后厂村路灯  视频教程 【AudioRecorder】iPhone通话录音汉化破解版-使用巨魔安装-ios17绕道目前

    2024年02月20日
    浏览(273)
  • 在微信小程序使用fixed布局固定input 输入框,iPhone ios系统无法获取焦点问题解决。

    问题 微信小程序 是fixed布局后 ios版本 input 输入框 无法选中 但是长按可以获取焦点 。 解决 查看微信小程序开发文档 对input的介绍 https://developers.weixin.qq.com/miniprogram/dev/component/input.html 发现了 always-embed 属性 强制 input 处于同层状态,默认 focus 时 input 会切到非同层状态 (仅在

    2024年02月12日
    浏览(57)
  • iPhone X(iOS 14.6)在Win 10上使用iRemoval PRO v5.1.2进行越狱

    1.越狱前备份好重要的文件和数据,越狱有风险,刷机需谨慎,后果自负。 2.此处的越狱指不完美越狱,即重启会恢复到未越狱状态,设置锁屏密码也会导致机器强制关机重启并恢复到未越狱状态,重新越狱成功后,之前安装的插件会重新生效,不需要重新安装。 3.iRemoval P

    2024年02月04日
    浏览(43)
  • 将iPhone备份到移动硬盘

    如果你日常习惯将 iPhone 数据备份到 Mac 电脑上,你可能会发现 电脑磁盘空间紧张的问题。虽然苹果并没有将 iPhone 备份到外部硬盘的设置选项, 但这是可以做到的。本文介绍了如何在使用 iOS 16.6 和 macOS Ventura 13.5(或更高版本)下将你的 iPhone 备份到移动硬盘或其他外置存储设

    2024年02月12日
    浏览(40)
  • 苹果iPhone手机iOS17系统怎么下载安装更新iPhone苹果ios17系统?

    苹果iPhone手机iOS17系统怎么下载安装更新iPhone苹果ios17系统? 1、在苹果iPhone手机上,找到并打开【设置】; 2、打开设置后,找到并点击进入【通用】; 3、在通用内找【软件更新】并点击进入; 4、在软件更新内找到并点击【Beta版更新】,选择【iOS17】;  5、选择iOS17后,点击

    2024年02月12日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包