天天看點

iOS開發中 JSON 和 Model 轉換 以及泛形的寫法

前言

現在iOS的開發語言 有

OC

Swift

Swift

本來就支援

泛形

OC

XCode7

後也支援

泛形

OC庫

現在支援

JSON

Model

轉換的

OC庫

有很多 例如:

  • MJExtension

  • YYModel

  • Mantle

  • FastEasyMapping

  • JSONModel

前三種無侵入 後兩種則需要修改

Model

推薦使用

MJExtension

YYModel

但是它們都

不支援

泛形的Model

轉換

Swift庫

現在支援

JSON

Model

轉換的

Swift庫

常用的如下

  • ObjectMapper

  • SwiftyJSON

它們都

支援

泛形的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)           

複制