看到这篇文章,要知道这篇文章告诉你什么,就是对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
}