美文网首页iOS记录
iOS开发中 JSON 和 Model 转换 以及泛形的写法

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

作者: bianruifeng | 来源:发表于2019-10-27 14:17 被阅读0次

    原文:https://cloud.tencent.com/developer/article/1524504

    前言

    现在iOS的开发语言 有 OCSwift Swift 本来就支持泛形 OCXCode7 后也支持泛形
    json转model 工具 SKGenerateModelTool

    OC库

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

    前三种无侵入 后两种则需要修改Model 推荐使用MJExtensionYYModel
    性能的话:手动是最快的(自己写),其次是 YYModel 性能比较

    但是它们都不支持泛形的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)
    

    相关文章

      网友评论

        本文标题:iOS开发中 JSON 和 Model 转换 以及泛形的写法

        本文链接:https://www.haomeiwen.com/subject/dwgpvctx.html