iOS开发(二)之swift中的json序列化

失败了我不后悔,但我一定后悔没有去尝试 - 杰夫 贝索斯

JSON是JavaScript Object Notation的缩写,它是一种轻量级的数据格式,一般用于数据交互,服务器返回给客户端的数据,一般是JSON格式或者XML格式(文件下载除外)。

然而在app开发中,我们需要将用户设置的数据上传到后台。我们根据后台提供的接口文档,有些参数往往需要将一些字典和数组需要先转为json格式的然后上传,以方便后台进行处理!

虽然oc和swift语言中都是使用苹果提供的NSJSONSerialization类来json序列化,但是swift处理还是与OC有所不同的,所以今天分享swift中json序列化。

我将以艺学教师版中老师将教学科目设置好之后保存到后台服务器为例:

  1. 如下图我需要将红框内的已选科目上传到后台:
    subject.png
  2. 后台提供的接口文档描述如下:
    format.png
  3. 下面的代码是点击保存之后上传数据到后台
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    var arr = [[String: AnyObject]]()
    for selModel in selectedList { // var selectedList = [TeachSubjectEntity]() // 已选科目
    var dict = [String: AnyObject]()
    dict["son_name"] = selModel.cname
    for model in dataList {
    if selModel.pid == model.ID { // var dataList = [TeachSubjectEntity]() // 所有分类
    dict["parent_name"] = model.cname
    }
    }
    arr.append(dict)
    }

    var params = [String: AnyObject]()
    params["token"] = Token
    params["id"] = YXAccount.sharedAccount().ID

    do {
    let list = try NSJSONSerialization.dataWithJSONObject(arr, options: .PrettyPrinted)
    let listJson = NSString(data: list, encoding: NSUTF8StringEncoding)
    params["list"] = listJson
    } catch {
    print(error)
    }

    YXHttpTool.post(AddTeachSubjectURL, params: params, success: { (JSON) in

    if let dict = JSON as? [String: NSObject], code = dict["code"], msg = dict["msg"]{
    SVProgressHUD.setMinimumDismissTimeInterval(0.8)
    if code == "0" {
    SVProgressHUD.showSuccessWithStatus("保存成功")
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), {
    self.navigationController?.popViewControllerAnimated(true)
    })
    } else {
    SVProgressHUD.showErrorWithStatus(msg as! String)
    }
    }
    }) {

    }

其中下面这段代码就是将数组转为json格式的, swift2.0之后就必须以抛出一个异常的方式来转json字符串, 下面的思路是先将数组转为NSData,再进一步转为JSonString。

1
2
3
4
5
6
7
do {
let list = try NSJSONSerialization.dataWithJSONObject(arr, options: .PrettyPrinted)
let listJson = NSString(data: list, encoding: NSUTF8StringEncoding)
params["list"] = listJson
} catch {
print(error)
}