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

前言

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

OC库

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

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

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

Swift库

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

它们都支持泛形的Model转换

泛形

OC泛形

ZJUser.h

1
2
3
4
5
6
#import <objc/NSObject.h>

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

ZJUser.m

1
2
3
4
5
6
#import <Foundation/Foundation.h>
#import "ZJUser.h"

@implementation ZJUser

@end

ZJResult.h

1
2
3
4
5
6
7
#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

1
2
3
4
5
6
#import <Foundation/Foundation.h>
#import "ZJResult.h"

@implementation ZJResult

@end

使用方式

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

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

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

Swift泛形

配合SwiftyJSON

1
2
3
4
5
6
import Foundation
import SwiftyJSON

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

obj为数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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为对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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"])
}
}

对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
}
}

使用方式

1
2
3
4
5
6
// String --> model
let result = ZJResultList<ZJArticle>(jsonData:json);
// model --> String
if let string = result.rawString() {

}

配合ObjectMapper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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"]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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"]
}
}

使用方式

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