iOS处理json,序列化和反序列化

这篇具有很好参考价值的文章主要介绍了iOS处理json,序列化和反序列化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mantle 是一个开源的 Objective-C 框架,用于在 iOS 和 macOS 应用程序中实现模型层的序列化和反序列化。它提供了一种简单而强大的方式来将 JSON数据格式转换为自定义的数据模型对象,以及将数据模型对象转换为字典或 JSON 格式。

Mantle具有如下特点

自动映射

Mantle自动将 JSON 数据与模型属性进行映射,无需手动解析和赋值。

支持嵌套

Mantle 支持在模型中嵌套其他模型对象。

支持集合

Mantle 支持数组和字典等集合类型。你可以将集合类型的属性映射到 JSON 数组或字典,并在Model中进行使用

属性转换

Mantle 允许你自定义属性值的转换。你可以定义自定义的属性转换方法,将属性的类型转换为其他类型,或者根据需要进行数据转换,以适应模型和外部数据的差异。

安装

在CocoaPods的Podfile中添加

pod 'Mantle', '~> 2.2.0'

执行pod install,安装成功后,工程可以使用Mantle了。

使用Mantle解析JSON

现有json文件

{
  "name": "John Doe",
  "age": 25,
  "address": {
    "city": "New York",
    "country": "USA"
  },
  "interests": ["reading", "traveling", "photography"]
}

为了从json转换为Objective-C的Model,我们可以写出Model类

#import <Mantle/Mantle.h>
//嵌套的类型
@interface AddressModel : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy) NSString *city;
@property (nonatomic, copy) NSString *country;
@end

@implementation AddressModel
//映射字典,属性city对应JSON里面的city,country对应JSON里面的country
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
        @"city": @"city",
        @"country": @"country"
    };
}
@end

@interface UserModel : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) AddressModel *address;
@property (nonatomic, strong) NSArray<NSString *> *interests;
@end

@implementation UserModel
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
        @"name": @"name",
        @"age": @"age",
        @"address": @"address",
        @"interests": @"interests"
    };
}
//对于嵌套类型,需要添加JSONTransformer
+ (NSValueTransformer *)addressJSONTransformer {
    return [MTLJSONAdapter dictionaryTransformerWithModelClass:AddressModel.class];
}
//对于集合类型,需要添加JSONTransformer 
+ (NSValueTransformer *)interestsJSONTransformer {
    return [MTLJSONAdapter arrayTransformerWithModelClass:NSString.class];
}
@end

上面这个例子演示了Mantle的属性转换,嵌套类型,集合类型的使用方法,需要注意的是每个Model都需要继承自MTLModel类,并且实现MTLJSONSerializing协议。

如果需要做类型转化,比如string类型转换为Date类型,可以使用NSValueTransformer来实现,这个时候需要在自定义的Model添加dateValueTransformer方法,运行的时候会自动调用dateValueTransformer方法完成类型转换。

+ (NSValueTransformer *)dateValueTransformer {
    return [MTLValueTransformer transformerUsingForwardBlock:^id(id value, BOOL *success, NSError *__autoreleasing *error) {
        if ([value isKindOfClass:NSDate.class]) {
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            formatter.dateFormat = @"yyyy-MM-dd";
            return [formatter stringFromDate:value];
        }
        return nil;
    } reverseBlock:^id(id value, BOOL *success, NSError *__autoreleasing *error) {
        if ([value isKindOfClass:NSString.class]) {
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            formatter.dateFormat = @"yyyy-MM-dd";
            return [formatter dateFromString:value];
        }
        return nil;
    }];
}

完成Model类的JSON转换规则后,我们只需要调用modelOfClass方法即可把JSON转化为Model类,使用起来是很简单的。

UserModel *user = [MTLJSONAdapter modelOfClass:UserModel.class fromJSONDictionary:json error:&error];

使用Mantle把Model转换为JSON

现有Model定义如下

// 创建模型对象
UserModel *person = [[UserModel alloc] init];
person.name = @"John";
person.age = 20;
person.birthDate = [NSDate date];

如果要转换为JSON,只需要调用JSONDictionaryFromModel方法文章来源地址https://www.toymoban.com/news/detail-503004.html

// 进行序列化
NSDictionary *jsonDictionary = [MTLJSONAdapter JSONDictionaryFromModel:person];

到了这里,关于iOS处理json,序列化和反序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

    当谈到网络编程时,序列化和反序列化是非常重要的概念。在上一篇文章中,我们已经了解了在Linux环境下实现简单的TCP网络程序的基础知识。本文将继续探讨序列化和反序列化,这些概念对于在网络上传输数据以及跨网络通信至关重要。通过深入了解序列化和反序列化,我

    2024年04月08日
    浏览(88)
  • Spring Boot 中使用 ObjectMapper 进行 JSON 序列化和反序列化

    在 Java 中,可以使用各种 JSON 序列化和反序列化工具将 Java 对象转换为 JSON 字符串或者将 JSON 字符串转换为 Java 对象。其中,Jackson 库是比较常用的 JSON 序列化和反序列化工具之一,它提供了 ObjectMapper 类,用于将 Java 对象转换为 JSON 字符串,或者将 JSON 字符串转换为 Java 对象

    2024年02月14日
    浏览(44)
  • C#: Json序列化和反序列化,集合为什么多出来一些元素?

    如下面的例子,很容易看出问题: 如果类本身的无参构造函数, 就添加了一些元素,序列化,再反序列化,会导致元素增加。 如果要避免,必须添加: new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace }

    2024年02月10日
    浏览(56)
  • cJSON(C语言JSON)库(适用于嵌入式序列化和反序列化)

    JSON与序列化和反序列化 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示结构化数据。JSON 格式广泛用于将数据从一个应用程序传输到另一个应用程序,特别是在Web应用程序中,因为它与JavaScript兼容,容易在客户端和服务器之间进

    2024年02月04日
    浏览(34)
  • 又一个难题:Java 序列化和反序列化为什么要实现 Serializable 接口?

    作者:椰子Tyshawn 来源:https://blog.csdn.net/litianxiang_kaola 最近公司的在做服务化, 需要把所有model包里的类都实现Serializable接口, 同时还要显示指定serialVersionUID的值. 听到这个需求, 我脑海里就突然出现了好几个问题, 比如说: 序列化和反序列化是什么? 实现序列化和反序列化为什

    2024年02月08日
    浏览(51)
  • Unity-序列化和反序列化

    序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。 在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。 1 自定义的具有Serializable特性的非抽象、

    2024年01月24日
    浏览(56)
  • 【Linux】序列化和反序列化

    在网络编程中,直接使用 结构体 进行数据传输会出错,因为 本质上socket无法传输结构体 ,我们只有将结构体装换为字节数组,或者是字符串格式来传输,然后对端主机收到了数据,再将其转化为结构体,这就是序列化和反序列化的过程! 序列化 (Serialization)是将对象的状态

    2024年02月10日
    浏览(42)
  • Java序列化和反序列化

    目录 一、序列化和反序列化 二、Java序列化演示 三、反序列化漏洞 1、含义 ​序列化就是内存中的对象写入到IO流中,保存的格式可以是二进制或者文本内容。反序列化就是IO流还原成对象。 2、用途 (1)传输网络对象 (2)保存Session 1、序列化 java.io.ObjectOutputStream代表对象

    2023年04月25日
    浏览(38)
  • 什么是序列化和反序列化?

    JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是两种常用的数据交换格式,用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式,它使用易于理解的键值对的形式表示数据。JSON数据结构简单明了,易于读写和解析,是基于JavaScript的一种常用数据

    2024年02月09日
    浏览(57)
  • Java序列化和反序列化机制

    在阅读 ArrayList 源码的时候,注意到,其内部的成员变量动态数组 elementData 被Java中的 transient 修饰 transient 意味着Java在序列化时会跳过该字段(不序列化该字段) 而Java在默认情况下会序列化类(实现了 Java.io.Serializable 接口的类)的所有非瞬态(未被 transient 修饰

    2024年03月15日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包