专栏首页码客iOS开发中 JSON 和 Model 转换 以及泛形的写法

iOS开发中 JSON 和 Model 转换 以及泛形的写法

前言

现在iOS的开发语言 有 OCSwift Swift 本来就支持泛形 OCXCode7 后也支持泛形

OC库

现在支持 JSONModel 转换的OC库有很多 例如:

前三种无侵入 后两种则需要修改Model 推荐使用MJExtensionYYModel

但是它们都不支持泛形的Model转换

Swift库

现在支持 JSONModel 转换的Swift库 常用的如下

它们都支持泛形的Model转换

泛形

OC泛形

ZJUser.h

#import <objc/NSObject.h>

@interface ZJUser : NSObject
@property(readwrite,nonatomic,assign) int userId;
@property(nonatomic,copy)NSString* name;
@end

ZJUser.m

#import <Foundation/Foundation.h>
#import "ZJUser.h"

@implementation ZJUser

@end

ZJResult.h

#import <objc/NSObject.h>

@interface ZJResult<objectType:NSObject *> : NSObject
@property(nonatomic,copy)NSString* state;
@property(nonatomic,copy)NSString* message;
@property(nonatomic,strong)objectType data;
@end

ZJResult.m

#import <Foundation/Foundation.h>
#import "ZJResult.h"

@implementation ZJResult

@end

使用方式

ZJResult<ZJUser *> *result = [[ZJResult<ZJUser *> alloc]init];

配合AFNetworking代码 也就是泛形的部分 重新转换 并赋值

ZJResult<ZJUser *> *result = [ZJResult<ZJUser *> yy_modelWithJSON:responseObject];
result.data = [ZJUser yy_modelWithJSON:responseObject[@"data"]];
NSLog(@"%@",result.message);
NSLog(@"%@",result.data.name);

Swift泛形

配合SwiftyJSON

import Foundation
import SwiftyJSON

public protocol ZJSwiftyJSONAble {
    init?(jsonData:JSON)
}

obj为数组

import Foundation
import SwiftyJSON

class ZJResultList<T: ZJSwiftyJSONAble>: ZJSwiftyJSONAble {
    var success: String!
    var msg: String!
    var obj: [T]?

    required init?(jsonData:JSON){
        self.success = jsonData["success"].stringValue
        self.msg = jsonData["msg"].stringValue
        self.obj = jsonData["obj"].arrayValue.flatMap { T(jsonData: $0) }
    }
}

obj为对象

import Foundation
import SwiftyJSON

class ZJResultModel<T: ZJSwiftyJSONAble>: ZJSwiftyJSONAble {
    var success: String!
    var msg: String!
    var obj: T?

    required init?(jsonData:JSON){
        self.success = jsonData["success"].stringValue
        self.msg = jsonData["msg"].stringValue
        self.obj = T(jsonData: jsonData["obj"])
    }
}

对象

import Foundation
import SwiftyJSON

class ZJArticle: ZJSwiftyJSONAble {
    var title: String!
    var date: String!
    var url: String!
    
    required init?(jsonData:JSON){
        self.title = jsonData["title"].stringValue
        self.date = jsonData["date"].stringValue
        self.url = jsonData["url"].stringValue
    }
}

使用方式

// String --> model
let result = ZJResultList<ZJArticle>(jsonData:json);
// model --> String
if let string = result.rawString() {
    
}

配合ObjectMapper

import Foundation
import ObjectMapper
struct ZJResult<T: Mappable>: Mappable {
    var success: Bool!
    var msg: String!
    var obj: [T]?

    init?(map: Map) {

    }

    // Mappable
    mutating func mapping(map: Map) {
        success     <- map["success"]
        msg         <- map["msg"]
        obj         <- map["obj"]
    }
}
import Foundation
import ObjectMapper
struct ZJArticle: Mappable {
    var title: String!
    var tags: String!
    var description: String!
    var date: String!
    var path: String!
    var url: String!

    init?(map: Map) {

    }

    // Mappable
    mutating func mapping(map: Map) {
        title    <- map["title"]
        keywords   <- map["keywords"]
        description   <- map["description"]
        date   <- map["date"]
        path   <- map["path"]
        url   <- map["url"]
    }
}

使用方式

// JSON String --> Model
let result = Mapper<ZJResult<ZJArticle>>().map(JSONString: JSONString)
// Model --> JSON String
let JSONString = Mapper().toJSONString(result, prettyPrint: true)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • IOS/MacOS沙箱逃逸竞赛

    iOS 12在几周前发布了,并带来了许多安全方面的修复和改进。特别是,这个新版本碰巧修补了我们在Synacktiv发现的一个很厉害的内核漏洞。

    安恒网络空间安全讲武堂
  • Safari扩展

    本系列文章分两部分,介绍macOS浏览器扩展背后的技术,以及恶意插件如何窃取密码、银行细节和其他敏感用户数据。

    安恒网络空间安全讲武堂
  • iOS学习——iOS项目增加新的字体

      在项目开发过程中,iOS系统自带的字体库可能不适应需求,需要导入其他的字体库。下面是iOS项目增加新的字体的基本思路,基本上分为三步:

    mukekeheart
  • iOS学习——#define、const、typedef的区别

    在iOS开发中经常遇到一些字段和类型的定义,例如配置生产和测试不同环境的参数等,这时候经常用到#define、const以及typedef。那么它们之间有什么区...

    mukekeheart
  • iPhone误删通讯录怎么恢复?说出来可能你不信

      iPhone误删通讯录怎么恢复?很多苹果用户在刚使用的时候对一些操作有些不熟悉,这样可能就会因为一些误操作将手机中的数据删除了,可是当要找回删除的数据怎么办...

    科技第六人
  • 从6730个微信用户中分析出大家的手机使用习惯

    之前写了一篇分析小程序用户微信名的文章,从00-90后的微信昵称,发现如下规律。。。大家反响很大,喜欢不喜欢的都有,全网各个平台(微信+网站)总浏览量超10万,...

    数据森麟
  • iOS学习——页面的传值方式iOS----KVC和KVO 详解

    在iOS开发过程中,页面跳转时在页面之间进行数据传递是很常见的事情,我们称这个过程为页面传值。页面跳转过程中,从主页面跳转到子页面的数据传递称之为正向传值;反...

    mukekeheart
  • iOS学习——NSLog输出各种类型

    在开发过程中,在调试过程中经常打印不出自己想要的数据格式,还时常报警告,所以整理了一下iOS中用NSLog打印各种数据类型的样式。 整型占位符说明 : %d ...

    mukekeheart
  • uni-app自定义弹窗模板uniPop组件

    uni-app自定义弹窗uniPop.vue模板|uniapp仿微信弹窗/仿ios弹窗效果|msg信息框|alert对话框|loading提示框

    andy2018
  • H5网页唤醒App有哪些做法

    在这个流量为王的互联网背景下,移动端的H5页面显然在导流上承担着重要作用,在H5页面上,我们对引流的需求有两种:

    走在河边的小鹿

扫码关注云+社区

领取腾讯云代金券