前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS开发中 JSON 和 Model 转换 以及泛形的写法

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

作者头像
码客说
发布2019-10-22 14:31:05
2.1K0
发布2019-10-22 14:31:05
举报
文章被收录于专栏:码客码客

前言

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

OC库

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

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

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

Swift库

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

它们都支持泛形的Model转换

泛形

OC泛形

ZJUser.h

代码语言:javascript
复制
#import <objc/NSObject.h>

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

ZJUser.m

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import "ZJUser.h"

@implementation ZJUser

@end

ZJResult.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import "ZJResult.h"

@implementation ZJResult

@end

使用方式

代码语言:javascript
复制
ZJResult<ZJUser *> *result = [[ZJResult<ZJUser *> alloc]init];

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

代码语言:javascript
复制
ZJResult<ZJUser *> *result = [ZJResult<ZJUser *> yy_modelWithJSON:responseObject];
result.data = [ZJUser yy_modelWithJSON:responseObject[@"data"]];
NSLog(@"%@",result.message);
NSLog(@"%@",result.data.name);

Swift泛形

配合SwiftyJSON
代码语言:javascript
复制
import Foundation
import SwiftyJSON

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

obj为数组

代码语言:javascript
复制
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为对象

代码语言:javascript
复制
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"])
    }
}

对象

代码语言:javascript
复制
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
    }
}

使用方式

代码语言:javascript
复制
// String --> model
let result = ZJResultList<ZJArticle>(jsonData:json);
// model --> String
if let string = result.rawString() {
    
}
配合ObjectMapper
代码语言:javascript
复制
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"]
    }
}
代码语言:javascript
复制
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"]
    }
}

使用方式

代码语言:javascript
复制
// JSON String --> Model
let result = Mapper<ZJResult<ZJArticle>>().map(JSONString: JSONString)
// Model --> JSON String
let JSONString = Mapper().toJSONString(result, prettyPrint: true)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • OC库
      • Swift库
      • 泛形
        • OC泛形
          • Swift泛形
            • 配合SwiftyJSON
            • 配合ObjectMapper
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档