kobewzl

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

看到这篇文章,要知道这篇文章告诉你什么,就是对json的解析的一个解释,解析的代码去百度就可以了,OC的、安卓的、JS的等等都很多,但是对于swift语言的小白来说,资料就少之又少,包括一些看不懂的,这篇就是解释,要让小白看懂:

先上代码,这是最基本的获取json形式

let url = NSURL(string: "http://... ...")

let data = NSData(contentsOfURL: url!)

if data != nil {

      let dict: NSDictionary = (try! NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)) as! NSDictionary  //通过系统的方法来获取json,实际开发中会用到第三方库,如alamofire,为了给小白看(大神不看这篇),用最基本的。。这时取到的json数据是字典

      print("得到json数据了")

      print(dict)      //输出json数据

      rst = dict.objectForKey("rst") as! Int          //通过key来获取值,经典的键值对形式key-value

      ecd = dict.objectForKey("ecd") as! Int

看得懂最基本的json,那么实际运用中,我不会只对一个key来取value,如tableview的cell肯定是数组的形式呀,这时候小白已经翻阅了别人的代码看了多遍,仍然不知别人的cell数据从哪里获得,原因就是,一般的做法是将json对象转换为model存了起来,再从model对象去取,这一步转化让很多小白浪费了很多时间。

 

class consumerDetail: NSObject, DictModelProtocol {

    var rst:Int = -1

    var total:Int = -1

    var rows:[Details]?

class func loadConsumerDetail(completion:(data: consumerDetail?, error: NSError?) -> Void) {

        let url = NSURL(string: "http://183.252.21.19:81/bhys/d/api/?apiType=costDetail&rqsJson=%7B%22cardNo%22:%229999000002111%22%7D&sign=123456789")

        let data = NSData(contentsOfURL: url!)

//        let path = NSBundle.mainBundle().pathForResource("Details", ofType: nil)   //这是一开始测试的时候用的本地json数据

//        let data = NSData(contentsOfFile: path!)

        if data != nil {

            let dict: NSDictionary = (try! NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)) as! NSDictionary

            let rspJson = dict.objectForKey("rspJson") as! NSDictionary

            print("得到json数据了")

            let modelTool = DictModelManager.sharedManager   //此处的DictModelManager是自定义转换类,类如下文

            let data = modelTool.objectWithDictionary(rspJson, cls: consumerDetail.self) as? consumerDetail   //得到转换类的字典转对象方法将对象存起来,回调completion返回data数据就是对象,错误不做处理

            completion(data: data, error: nil)

        }

    }

    static func customClassMapping() -> [String : String]? {

        return ["rows" : "\(Details.self)"]     //模型的配对

    }

}

class Details:NSObject {    //模型,是不是和javabean很像,其实swift和java挺像的,个人觉得

    var amount: String?

    var orgName: String?

    var occurTime: String?

    var state:String?

}

 

 

 

 

 

下面是viewcontroller,取得data对象后,将其放入模型中,如下

private var detail: consumerDetail?

override func viewDidLoad() {

        super.viewDidLoad()

        self.title = "消费明细"

        setTableView()

        consumerDetail.loadConsumerDetail { (data, error) -> Void in

            let tmpSelf = self

            tmpSelf.detail = data

        }

    }

当cell获取时就可以轻松得到了

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = detailCellTableViewCell.cellWithTableView(tableView)

        let goods = detail?.rows![indexPath.row]

        cell.details = goods

        print("得到cell")

        return cell

    }

 

 

 

//自定义转换类  

public class DictModelManager {

    private static let instance = DictModelManager()

    // 全局public统一访问入口

    public class var sharedManager: DictModelManager {

        return instance

    }

    //  字典转模型

    //  - parameter dict: 数据字典

    //  - parameter cls:  模型类

    //  - returns: 模型对象

    public func objectWithDictionary(dict: NSDictionary, cls: AnyClass) -> AnyObject? {

        let ns = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String

        // 模型信息

        let infoDict = fullModelInfo(cls)

        let obj: AnyObject = (cls as! NSObject.Type).init()

        autoreleasepool {  // 3. 遍历字典对🐘

            for (k, v) in infoDict {

                if let value: AnyObject = dict[k] {

                    if v.isEmpty {

                        if !(value === NSNull()) {

                            obj.setValue(value, forKey: k)

                        }

                    } else {

                        let type = "\(value.classForCoder)"

                        if type == "NSDictionary" {

                            if let subObj: AnyObject = objectWithDictionary(value as! NSDictionary, cls: NSClassFromString(ns + "." + v)!) {

                                obj.setValue(subObj, forKey: k)

                            }

                        } else if type == "NSArray" {

                            if let subObj: AnyObject = objectsWithArray(value as! NSArray, cls: NSClassFromString(ns + "." + v)!) {

                                obj.setValue(subObj, forKey: k)

                            }

                        }

                    }

                }

            }

        }        

        return obj

    }

 

posted on 2016-04-16 15:54  kobewzl  阅读(258)  评论(0编辑  收藏  举报