美文网首页
SwiftyJSON使用

SwiftyJSON使用

作者: 星空WU | 来源:发表于2021-01-05 14:26 被阅读0次

注意是github中名字是 SwiftyJSON,因为用cocopoads搜索有很多类似的库,但是使用是有区别的

1,SwiftyJSON介绍与配置

SwiftyJSON是个使用Swift语言编写的开源库,可以让我们很方便地处理JSON数据(解析数据、生成数据)。

GitHub地址:https://github.com/SwiftyJSON/SwiftyJSON

使用配置:直接将 SwiftyJSON.swift 添加到项目中即可

2,SwiftyJSON的优点

同 JSONSerializationSwiftyJSON 相比,在获取多层次结构的JSON数据时。SwiftyJSON不需要一直判断这个节点是否存在,是不是我们想要的class,下一个节点是否存在,是不是我们想要的class…。同时,SwiftyJSON内部会自动对optional(可选类型)进行拆包(Wrapping ),大大简化了代码。

下面通过几个样例作为演示。

1)比如我们有一个如下的JSON数据,表示联系人集合:

[

    {

        "name": "hangge",

        "age": 100,

        "phones": [

            {

                "name": "公司",

                "number": "123456"

            },

            {

                "name": "家庭",

                "number": "001"

            }

        ]

    },

    {

        "name": "big boss",

        "age": 1,

        "phones": [

            {

                "name": "公司",

                "number": "111111"

            }

        ]

    }

]

为便于测试比较,我们先将JSON格式的字符串转为Data:

let jsonStr = "[{\"name\": \"hangge\", \"age\": 100, \"phones\": [{\"name\": \"公司\",\"number\": \"123456\"}, {\"name\": \"家庭\",\"number\": \"001\"}]}, {\"name\": \"big boss\",\"age\": 1,\"phones\": [{ \"name\": \"公司\",\"number\": \"111111\"}]}]"

if let jsonData = jsonStr.data(using: String.Encoding.utf8, allowLossyConversion: false) {

    //.........

}

2)使用JSONSerializationSwiftyJSON解析

比如我们要取第一条联系人的第一个电话号码,每个级别都判断就很麻烦,代码如下:

if let userArray = try? JSONSerialization.jsonObject(with: jsonData,

                                        options: .allowFragments) as? [[String: AnyObject]],

    let phones = userArray?[0]["phones"] as? [[String: AnyObject]],

    let number = phones[0]["number"] as? String {

    // 找到电话号码

    print("第一个联系人的第一个电话号码:",number)

}

2)使用SwiftyJSON解析:

不用担心数组越界,不用判断节点,拆包什么的,代码如下:

let json = try! JSON(data: jsonData)

if let number = json[0]["phones"][0]["number"].string {

    // 找到电话号码

    print("第一个联系人的第一个电话号码:",number)

}

如果没取到值,还可以走到错误处理来了,打印一下看看错在哪:

let json = try! JSON(data: jsonData)

if let number = json[0]["phones"][0]["number"].string {

    // 找到电话号码

    print("第一个联系人的第一个电话号码:",number)

}else {

    // 打印错误信息

    print(json[0]["phones"][0]["number"])

}

3,获取网络数据,并使用SwiftyJSON解析

(1)与URLSession结合

     func getDataBySwiftJson()

    {

        //此网络地址已经失效

        let url = URL(string: "http://www.hangge.com/getJsonData.php")

        //创建请求对象

        letrequest =URLRequest(url: url!)

        letdataTask =URLSession.shared.dataTask(with: request) { (data, response, error)in

            iferror!=nil{

                print("error")

            }else

            {

                print("解析正确: data=\(data!)")

                ifletresponseData = data

                {

                     ifletjsonObject =try?JSON(data: responseData)

                     {

                        ifletnumber = jsonObject[0]["phones"][0]["number"].string

                        {

                            print("第一个人的电话:\(number)")

                        }else

                        {

                            print("解析出错:\(jsonObject[0]["phones"][0]["number"].string!)")

                        }

                    }else

                     {

                        print("对象转化失败")

                    }

                }else

                {

                    print("data 为空")

                }

            }

        }

        dataTask.resume()

    }

2)与Alamofire结合

//创建URL对象

let url = URL(string:"http://www.hangge.com/getJsonData.php")!

Alamofire.request(url).validate().responseJSON { response in

    switch response.result.isSuccess {

    case true:

        if let value = response.result.value {

            let json = JSON(value)

            if let number = json[0]["phones"][0]["number"].string {

                // 找到电话号码

                print("第一个联系人的第一个电话号码:",number)

            }

        }

    case false:

        print(response.result.error)

    }

}

4,获取值 

1)可选值获取(Optional getter)

    通过.number、.string、.bool、.int、.uInt、.float、.double、.array、.dictionary、int8、Uint8、int16、Uint16、int32、Uint32、int64、Uint64等方法获取到的是可选择值,我们需要自行判断是否存在,同时不存在的话可以获取具体的错误信息。

(2)不可选值获取(Non-optional getter)

使用 xxxValue 这样的属性获取值,如果没获取到的话会返回一个默认值。省得我们再判断拆包了。

3)获取原始数据(Raw object)

5,设置值

6,下标访问(Subscript)

可以通过数字、字符串、数组类型的下标访问JSON数据的层级与属性。比如下面三种方式的结果都是一样的:

7,循环遍历JSON对象中的所有数据

1)如果JSON数据是数组类型(Array)

(2)如果JSON数据是字典类型(Dictionary)

8,构造创建JSON对象数据

1)空的JSON对象

2)使用简单的数据类型创建JSON对象

3)使用数组或字典数据创建JSON对象

相关文章

网友评论

      本文标题:SwiftyJSON使用

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