精华内容
下载资源
问答
  • SwiftyJSON

    2018-11-27 14:14:05
    描述:SwiftyJSON是一个swift编写的对json数据进行解析的类库,SwiftyJSON的使用极其方便,而且不用担心数组越界等问题 GitHub地址:https://github.com/SwiftyJSON/SwiftyJSON 在本文写作时,SwiftyJSON在GitHub...

    描述:SwiftyJSON是一个swift编写的对json数据进行解析的类库,SwiftyJSON的使用极其方便,而且不用担心数组越界等问题

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

    在本文写作时,SwiftyJSON在GitHub上的star已经达到了14899,光看star就知道,这个库,还是比较值得用的。

    1.cocoapods导入并安装

    pod "SwiftyJSON" 
    

    2.在使用的文件中导入头文件

    import SwiftyJSON
    

    3.获取要解析的数据(此时为写死的假数据,实际使用的应该是通过API获取的数据或者其他途径获取的数据,此数据的结构为真实项目的数据结构,所以,解析方式也会以该项目的后续解析方式进行解析,基本能满足一般的项目的数据解析需求)

    var jsonData: [String: Any] = [:]
    jsonData["code"] = 200
    jsonData["result"] = true
    jsonData["message"] = "数据加载成功"
    jsonData["data"] = [["id"           : "资讯1_id",
                         "title"        : "资讯1_标题",
                         "pictrueUrl"   : "资讯1_图片",
                         "description"  : "资讯1_描述",
                         "categoryTitle": "资讯1_分类标题",
                         "tagArray"     : [["id":"yyy0bb1d82beb084718bbd88d45c39710d8","title":".net1"],
                                           ["id":"eee0bb1d82beb084718bbd88d45c39710d8","title":".net1"]],
                         "shareNumber"  : 1,
                         "clickNumber"  : 1],
                                
                         ["id"           : "资讯2_id",
                          "title"        : "资讯2_标题",
                          "pictrueUrl"   : "资讯2_图片",
                          "description"  : "资讯2_描述",
                          "categoryTitle": "资讯2_分类标题",
                          "tagArray"     : [["id":"yyy0bb1d82beb084718bbd88d45c39710d8","title":".net2"],
                                            ["id":"eee0bb1d82beb084718bbd88d45c39710d8","title":".net2"]],
                          "shareNumber"  : 2,
                          "clickNumber"  : 2]]
    

    4.创建JSON对象

    let jsonObj = JSON.init(jsonData)
    

    5.先判断code与result

    
    if jsonObj["result"].boolValue == false {
        print("获取失败")
        return
    }
    if jsonObj["code"].intValue != 200 {
    /// 此处应该是根据服务器返回的code值进行判断然后进行后续操作,现在只是简单的打印服务器返回的message
        print(jsonObj["message"].stringValue)
        return
    }
    

    6.解析数据主体,暂时将解析的数据均打印出来,实际使用中会对数据进行其他操作

    for dic in jsonObj["data"].arrayValue {
        print("id: ", dic["id"].stringValue)
        print("title: ", dic["title"].stringValue)
        print("pictrueUrl: ", dic["pictrueUrl"].stringValue)
        print("description: ", dic["description"].stringValue)
        print("categoryTitle: ", dic["categoryTitle"].stringValue)
        print("shareNumber: ", dic["shareNumber"].intValue)
        print("clickNumber: ", dic["clickNumber"].intValue)
                
        print("tagArray: ", dic["tagArray1"].arrayValue)
        for arr in dic["tagArray"].arrayValue {
            print("\t\ttagid: ", arr["id2"].stringValue)
            print("\t\ttitle: ", arr["title"].stringValue)
        }
    }
    

    7.打印的结果

     

    打印结果

    8.总结
    SwiftyJSON的使用很简单
    首先根据要解析的数据进行创建对象,然后解析数据

    创建JSON对象的方式有很多,如下

    /**
        方法一: 使用data数据创建一个JSON对象
    
         - parameter data:  用来解析的数据,data类型
         - parameter opt:   JSON解析的选项. 默认`.AllowFragments`.
         - parameter error: 用来返回错误的NSErrorPointer. 默认为`nil`.
         - returns: 创建的JSON对象
         */
        public init(data:Data, options opt: JSONSerialization.ReadingOptions = .allowFragments, error: NSErrorPointer = nil)
    
        /**
         方法二:使用json字符串创建一个JSON对象
    
         - parameter string: 一个正常的json字符串,例如 '{"a":"b"}'
         - returns: 创建的JSON对象
         */
        public static func parse(_ string:String) -> JSON
    
        /**
         方法三:使用一个对象创建一个JSON对象
    
         - parameter object:  这个对象必须有以下特性: 所有的对象是 NSString/String, NSNumber/Int/Float/Double/Bool, NSArray/Array, NSDictionary/Dictionary, 或 NSNull; 所有的字典的键是 NSStrings/String; NSNumbers 不允许是 NaN 或者 infinity.
         - returns: 创建的JSON对象
         */
        public init(_ object: Any)
    
        /**
         方法四:用一个JSON对象的数组创建一个JSON对象
    
         - parameter jsonArray: 一个Swift数组,数组的元素为JSON对象
    
         - returns: 创建的JSON对象
         */
        public init(_ jsonArray:[JSON])
    
        /**
         方法五:用一个值为JSON对象的字典创建一个JSON对象
    
         - parameter jsonDictionary: 一个Swif字典,字典的值是JSON对象
    
         - returns: 创建的JSON对象
         */
        public init(_ jsonDictionary:[String: JSON])
    
    

    解析的数据类型包括(除了URL与null,其余的每种数据类型都包括有可选值和默认值,如果需要自定义默认值,可以使用解析结果为可选的类型,如果不需要,可以直接使用默认值,所有带有默认值的类型,都是在以Value为后缀。例如,string获取的就是可选的字符串,而stringValue获取的就是带有默认值的字符串,非可选):

    public var double: Double?
    public var doubleValue: Double
    public var float: Float?
    public var floatValue: Float
    public var int: Int?
    public var intValue: Int
    public var uInt: UInt?
    public var uIntValue: UInt
    public var int8: Int8?
    public var int8Value: Int8
    public var uInt8: UInt8?
    public var uInt8Value: UInt8
    public var int16: Int16?
    public var int16Value: Int16
    public var uInt16: UInt16?
    public var uInt16Value: UInt16
    public var int32: Int32?
    public var int32Value: Int32
    public var uInt32: UInt32?
    public var uInt32Value: UInt32
    public var int64: Int64?
    public var int64Value: Int64
    public var uInt64: UInt64?
    public var uInt64Value: UInt64
    
    public var URL: URL?
    
    public var null: NSNull?
    
    public var numberValue: NSNumber
    public var number: NSNumber?
    
    public var stringValue: String
    public var string: String?
    
    public var boolValue: Bool
    public var bool: Bool?
    
    public var dictionaryObject: [String : Any]?
    public var dictionaryValue: [String : JSON]
    public var dictionary: [String : JSON]?
    
    public var arrayObject: [Any]?
    public var arrayValue: [JSON]
    public var array: [JSON]?
    
    

    结束:
    在文章的结束,放上一段我练习用的代码,基本就是把上面的步骤结合在一起

    
    import UIKit
    import SwiftyJSON
    
    class SwiftyJSONViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            view.backgroundColor = UIColor.white
            title = "SwiftyJSON"
        }
        
        private var jsonData: [String: Any] = [:]
        
        @IBAction func prepareJsonData(_ sender: UIButton) {
            
            jsonData["code"] = 200
            jsonData["result"] = true
            jsonData["message"] = "数据加载成功"
            jsonData["data"] = [["id"           : "资讯1_id",
                                 "title"        : "资讯1_标题",
                                 "pictrueUrl"   : "资讯1_图片",
                                 "description"  : "资讯1_描述",
                                 "categoryTitle": "资讯1_分类标题",
                                 "tagArray"     : [["id":"yyy0bb1d82beb084718bbd88d45c39710d8","title":".net1"],
                                                   ["id":"eee0bb1d82beb084718bbd88d45c39710d8","title":".net1"]],
                                 "shareNumber"  : 1,
                                 "clickNumber"  : 1],
                                
                                ["id"           : "资讯2_id",
                                 "title"        : "资讯2_标题",
                                 "pictrueUrl"   : "资讯2_图片",
                                 "description"  : "资讯2_描述",
                                 "categoryTitle": "资讯2_分类标题",
                                 "tagArray"     : [["id":"yyy0bb1d82beb084718bbd88d45c39710d8","title":".net2"],
                                                   ["id":"eee0bb1d82beb084718bbd88d45c39710d8","title":".net2"]],
                                 "shareNumber"  : 2,
                                 "clickNumber"  : 2]]
        }
        
        
        @IBAction func analysisJsonData(_ sender: UIButton) {
            
            let jsonObj = JSON.init(jsonData)
            
            if jsonObj["result"].boolValue == false {
                print("获取失败")
                return
            }
            if jsonObj["code"].intValue != 200 {
                print(jsonObj["message"].stringValue)
                return
            }
            
            print(jsonObj["message"].stringValue)
            
            for dic in jsonObj["data"].arrayValue {
                print("id: ", dic["id"].stringValue)
                print("title: ", dic["title"].stringValue)
                print("pictrueUrl: ", dic["pictrueUrl"].stringValue)
                print("description: ", dic["description"].stringValue)
                print("categoryTitle: ", dic["categoryTitle"].stringValue)
                print("shareNumber: ", dic["shareNumber"].intValue)
                print("clickNumber: ", dic["clickNumber"].intValue)
                
                print("tagArray: ", dic["tagArray1"].arrayValue)
                for arr in dic["tagArray"].arrayValue {
                    print("\t\ttagid: ", arr["id2"].stringValue)
                    print("\t\ttitle: ", arr["title"].stringValue)
                }
            }
        }
    }
    
    

    各位,别人为我们造了轮子,我们可以直接拿来用,但是,我们不应该只是会拿来用,在自己不忙的时候,研究一下别人写的好代码,尝试着写一点自己的轮子,我相信,那会比学会使用轮子更让人兴奋!!!


    链接:https://www.jianshu.com/p/293c16132d0a

    展开全文
  • SwiftyJSON SwiftyJSON makes it easy to deal with JSON data in Swift. Platform Build Status *OS Linux Why is the typical JSON handling in Swift NOT good Requirements Integration Usage...
  • Alamofire-SwiftyJSON 一个扩展,可以轻松地使用序列化的响应。 :warning_selector: 要与Swift 3.x一起使用,请确保您使用的是> = 2.0.0 :warning_selector: :warning_selector: 要与Swift 4.x一起使用,请确保...
  • IOS的SwiftyJSON

    2018-12-08 16:12:39
    移动IOS的SwiftyJSON资源包。移动IOS开发中如果要使用JSON数据对象,就要引入SwiftyJSON资源包
  • SwiftyJSON之使用分析

    千次阅读 2017-03-07 09:17:09
    SwiftYJSON

    1,SwiftyJSON介绍与配置

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

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

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

    2,SwiftyJSON的优点

    NSJSONSerializationSwiftyJSON相比,在获取多层次结构的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格式的字符串转为NSData:

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

    ifletjsonData = jsonStr.dataUsingEncoding(NSUTF8StringEncoding,

    allowLossyConversion:false) {

    //.........

    }

    (2)使用NSJSONSerializationSwiftyJSON解析

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

    if let userArray = try?NSJSONSerialization.JSONObjectWithData(jsonData,

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

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

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

    // 找到电话号码

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

    }

    即使使用optional来简化一下,代码也不少:

    if let userArray = try?NSJSONSerialization.JSONObjectWithData(jsonData,

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

    let number = (userArray?[0]["phones"]as? [[String:AnyObject]])?[0]["number"]

    as?String{

    // 找到电话号码

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

    }

    (3)使用SwiftyJSON解析:

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

    let json =JSON(data: jsonData)

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

    // 找到电话号码

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

    }


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

    let json =JSON(data: jsonData)

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

    // 找到电话号码

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

    }else{

    // 打印错误信息

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

    }

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

    除了解析本地的JSON数据,我们其实更常通过url地址获取远程数据并解析。

    (1)与NSURLSession结合

    //创建NSURL对象

    let url String:String="http://www.hangge.com/getJsonData.php"

    let url:NSURL! =NSURL(string:urlString)

    //创建请求对象

    let request:NSURLRequest=NSURLRequest(URL: url)

    let session =NSURLSession.sharedSession()

    let dataTask = session.dataTaskWithRequest(request,

    completionHandler: {(data, response, error) ->Voidin

    if error !=nil{

    print(error?.code)

    print(error?.description)

    }else{

    let json =JSON(data: data!)

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

    // 找到电话号码

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

    }

    }

    })asNSURLSessionTask

    //使用resume方法启动任务

    dataTask.resume()

    (2)与Alamofire结合

    //创建NSURL对象

    let urlString:String="http://www.hangge.com/code/test.php"

    let url:NSURL! =NSURL(string:urlString)

    Alamofire.request(.GET, url).validate().responseJSON { responsein

    switchresponse.result {

    case.Success:

    if let value = response.result.value {

    let json =JSON(value)

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

    // 找到电话号码

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

    }

    }

    case.Failure(leterror):

    print(error)

    }

    }

    4,获取值

    (1)可选值获取(Optional getter)

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

    //int

    if let age = json[0]["age"].int {

    print(age)

    }else{

    //打印错误信息

    print(json[0]["age"])

    }

    //String

    if let name = json[0]["name"].string {

    print(name)

    }else{

    //打印错误信息

    print(json[0]["name"])

    }

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

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

    //If not a Number or nil, return 0

    let age:Int= json[0]["age"].intValue

    //If not a String or nil, return ""

    let name:String= json[0]["name"].stringValue

    //If not a Array or nil, return []

    let list:Array = json[0]["phones"].arrayValue

    //If not a Dictionary or nil, return [:]

    let phone:Dictionary = json[0]["phones"][0].dictionaryValue

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

    let jsonObject:AnyObject= json.object

    if let jsonObject:AnyObject= json.rawValue

    //JSON转化为NSData

    if let data = json.rawData() {

    //Do something you want

    }

    //JSON转化为String字符串

    if let string = json.rawString() {

    //Do something you want

    }

    5,设置值

    json[0]["age"].int =  101

    json[0]["name"].string ="hangge.com"

    json[0]["phones"].arrayObject = [["name":"固话","number":110],["name":"手机","number":120]]

    json[0]["phones"][0].dictionaryObject = ["name":"固话","number":100]

    6,下标访问(Subscript)

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

    //方式1

    let number = json[0]["phones"][0]["number"].stringValue

    //方式2

    let number = json[0,"phones",0,"number"].stringValue

    //方式3

    let keys:[JSONSubscriptType] = [0,"phones",0,"number"]

    let number = json[keys].stringValue

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

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

    for(index,subJson):(String,JSON)injson {

    print("\(index):\(subJson)")

    }


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

    for(key,subJson):(String,JSON)injson[0] {

    print("\(key):\(subJson)")

    }


    8,构造创建JSON对象数据

    (1)空的JSON对象

    let json:JSON=nil

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

    //StringLiteralConvertible

    let json:JSON="I'm a son"

    //IntegerLiteralConvertible

    let json:JSON=  12345

    //BooleanLiteralConvertible

    let json:JSON=true

    //FloatLiteralConvertible

    let json:JSON=  2.8765

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

    //DictionaryLiteralConvertible

    let json:JSON=  ["I":"am","a":"son"]

    //ArrayLiteralConvertible

    let json:JSON=  ["I","am","a","son"]

    //Array & Dictionary

    var json:JSON=  ["name":"Jack","age": 25,"list": ["a","b","c", ["what":"this"]]]

    json["list"][3]["what"] ="that"

    json["list",3,"what"] ="that"

    let path = ["list",3,"what"]

    json[path] ="that"

    原文出自:www.hangge.com转载请保留原文链接:http://www.hangge.com/blog/cache/detail_968.html


    展开全文
  • swiftyJSON 的一些研究

    2017-08-01 16:34:19
    关于swiftyJSON 的使用和原理的介绍
  • SwiftyJSON用法详解

    2018-10-29 14:15:27
    1,SwiftyJSON介绍与配置 SwiftyJSON是个使用Swift语言编写的开源库,可以让我们很方便地处理JSON数据(解析数据、生成数据)。 GitHub地址:https://github.com/SwiftyJSON/SwiftyJSON使用配置:直接将 ...

    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数据,表示联系人集合:

    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

    [

        {

            "name""hangge"

            "age": 100, 

            "phones": [

                {

                    "name""公司"

                    "number""123456"

                }, 

                {

                    "name""家庭"

                    "number""001"

                }

            ]

        },

        {

            "name""big boss"

            "age": 1, 

            "phones": [

                {

                    "name""公司"

                    "number""111111"

                }

            ]

        }

    ]

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

    1

    2

    3

    4

    5

    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解析
    比如我们要取第一条联系人的第一个电话号码,每个级别都判断就很麻烦,代码如下:

    1

    2

    3

    4

    5

    6

    7

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

                                            options: .allowFragments) as? [[StringAnyObject]],

        let phones = userArray?[0]["phones"as? [[StringAnyObject]],

        let number = phones[0]["number"asString {

        // 找到电话号码

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

    }

    即使使用optional来简化一下,代码也不少:

    1

    2

    3

    4

    5

    6

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

                                            options: .allowFragments) as? [[StringAnyObject]],

        let number = (userArray?[0]["phones"as? [[StringAnyObject]])?[0]["number"asString {

        // 找到电话号码

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

    }


    (3)使用SwiftyJSON解析:
    不用担心数组越界,不用判断节点,拆包什么的,代码如下:

    1

    2

    3

    4

    5

    let json = try! JSON(data: jsonData)

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

        // 找到电话号码

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

    }

    原文:Swift - SwiftyJSON的使用详解(附样例,用于JSON数据处理)

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

    1

    2

    3

    4

    5

    6

    7

    8

    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解析
    除了解析本地的JSON数据,我们其实更常通过url地址获取远程数据并解析。
    (1)与URLSession结合

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    //创建URL对象

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

    //创建请求对象

    let request = URLRequest(url: url!)

     

    let dataTask = URLSession.shared.dataTask(with: request,

                           completionHandler: {(data, response, error) -> Void in

                            if error != nil{

                                print(error)

                            }else{

                                let json = try! JSON(data: data!)

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

                                    // 找到电话号码

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

                                }

                            }

    }) as URLSessionTask

     

    //使用resume方法启动任务

    dataTask.resume()


    (2)与Alamofire结合

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    //创建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等方法获取到的是可选择值,我们需要自行判断是否存在,同时不存在的话可以获取具体的错误信息。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    //int

    if let age = json[0]["age"].int {

        print(age)

    else {

        //打印错误信息

        print(json[0]["age"])

    }

         

    //String

    if let name = json[0]["name"].string {

        print(name)

    else {

        //打印错误信息

        print(json[0]["name"])

    }

    (2)不可选值获取(Non-optional getter)
    使用 xxxValue 这样的属性获取值,如果没获取到的话会返回一个默认值。省得我们再判断拆包了。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    //If not a Number or nil, return 0

    let age: Int = json[0]["age"].intValue

     

    //If not a String or nil, return ""

    let name: String = json[0]["name"].stringValue

     

    //If not a Array or nil, return []

    let list: Array<JSON> = json[0]["phones"].arrayValue

     

    //If not a Dictionary or nil, return [:]

    let phone: Dictionary<StringJSON> = json[0]["phones"][0].dictionaryValue


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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    let jsonObject = json.object as AnyObject

     

    let jsonObject = json.rawValue  as AnyObject

     

    //JSON转化为Data

    let data = json.rawData()

     

    //JSON转化为String字符串

    if let string = json.rawString() {

        //Do something you want

    }

     

    //JSON转化为Dictionary字典([String: AnyObject]?)

    if let dic = json.dictionaryObject {

        //Do something you want

    }

     

    //JSON转化为Array数组([AnyObject]?)

    if let arr = json.arrayObject {

        //Do something you want

    }


    5,设置值

    1

    2

    3

    4

    json[0]["age"].int =  101

    json[0]["name"].string =  "hangge.com"

    json[0]["phones"].arrayObject = [["name":"固话""number":110],["name":"手机""number":120]]

    json[0]["phones"][0].dictionaryObject = ["name":"固话""number":100]


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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    //方式1

    let number = json[0]["phones"][0]["number"].stringValue

         

    //方式2

    let number = json[0,"phones",0,"number"].stringValue

         

    //方式3

    let keys:[JSONSubscriptType] = [0,"phones",0,"number"]

    let number = json[keys].stringValue

     

    7,循环遍历JSON对象中的所有数据
    (1)如果JSON数据是数组类型(Array)

    1

    2

    3

    for (index,subJson):(StringJSONin json {

        print("\(index):\(subJson)")

    }

    原文:Swift - SwiftyJSON的使用详解(附样例,用于JSON数据处理)

     

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

    1

    2

    3

    for (key,subJson):(StringJSONin json[0] {

        print("\(key):\(subJson)")

    }

    原文:Swift - SwiftyJSON的使用详解(附样例,用于JSON数据处理)

     

    8,构造创建JSON对象数据
    (1)空的JSON对象

    1

    let json: JSON =  nil


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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    //StringLiteralConvertible

    let json: JSON "I'm a son"

     

    //IntegerLiteralConvertible

    let json: JSON =  12345

     

    //BooleanLiteralConvertible

    let json: JSON =  true

     

    //FloatLiteralConvertible

    let json: JSON =  2.8765


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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    //DictionaryLiteralConvertible

    let json: JSON =  ["I":"am""a":"son"]

     

    //ArrayLiteralConvertible

    let json: JSON =  ["I""am""a""son"]

     

    //Array & Dictionary

    var json: JSON =  ["name""Jack""age": 25, "list": ["a""b""c", ["what""this"]]]

    json["list"][3]["what"] = "that"

    json["list",3,"what"] = "that"

    let path:[JSONSubscriptType] = ["list",3,"what"]

    json[path] = "that"


    原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_968.html

    展开全文
  • swiftyjson 1. JSON解析是基础的一部分 (1. JSON Parsing Is Part of the Foundation) Photo by Mirko Blicke on Unsplash. Mirko Blicke在Unsplash上的照片 。 There are handfuls of well-known projects dealing ...

    swiftyjson

    1. JSON解析是基础的一部分 (1. JSON Parsing Is Part of the Foundation)

    Image for post
    Photo by Mirko Blicke on Unsplash.
    Mirko BlickeUnsplash上的照片

    There are handfuls of well-known projects dealing with JSON parsing employing various approaches and philosophies. SwiftyJSON is probably the earliest and most popular one among them. It’s less verbose and error-prone and leverages Swift’s powerful type system to handle all of the details.

    有许多著名的项目都在使用各种方法和理念来处理JSON解析。 SwiftyJSON可能是其中最早,最受欢迎的一种。 它不那么冗长且容易出错,并且利用Swift强大的类型系统来处理所有细节。

    JSONSerialization is the core of most JSON parsing projects. It comes from Swift’s Foundation framework and converts JSON into different Swift data types. People used raw JSONSerialization to parse JSON objects before projects like SwiftyJSON came up. But it can be painful, as the value type and JSON structure may vary. You need to manually handle errors and cast the type Any to Swift foundation types. It’s more error-prone.

    JSONSerialization是大多数JSON解析项目的核心。 它来自Swift的Foundation框架,并将JSON转换为不同的Swift数据类型。 在出现SwiftyJSON项目之前,人们使用原始的JSONSerialization解析JSON对象。 但这可能会很痛苦,因为值类型和JSON结构可能会有所不同。 您需要手动处理错误并将类型Any为Swift基础类型。 这更容易出错。

    JSONDecoder was announced with Swift 4 with more advanced and promising features. It decodes JSON objects to Swift objects and adopts the Decodable protocol.

    Swift 4宣布了JSONDecoder ,它具有更多高级功能和有前途的功能。 它将JSON对象解码为Swift对象,并采用Decodable协议。

    2.绩效基准 (2. Performance Benchmarking)

    Image for post
    Photo by David Guliciuc on Unsplash.
    David GuliciucUnsplash上的照片

    Looking back to the past few years, SwiftyJSON has been playing an important role in our project by saving us from the raw JSONSerialization pains.

    回顾过去的几年, SwiftyJSON通过使我们摆脱了原始的JSONSerialization痛苦而一直在我们的项目中扮演重要角色。

    But is it still compatible nowadays? Let’s start our benchmarking to compare these three approaches: the raw JSONSerialization, SwiftyJSON,and JSONDecoder.

    但是现在它仍然兼容吗? 让我们开始进行基准测试以比较这三种方法:原始JSONSerializationSwiftyJSONJSONDecoder

    The following simple Tweet JSON contains an array of Comments and a nested array of Replies:

    以下简单的Tweet JSON包含一个Comments数组和一个嵌套的Replies数组:

    Tweet and Comment objects are the JSON deserialized and mapped to, and they adopt the Codable protocol to support JSONDecoder. They also have two initializers, one for Dictionary from JSONSerialization and another for the JSON object from SwiftyJSON.

    TweetComment对象是反序列化并映射到的JSON,它们采用Codable协议来支持JSONDecoder 。 他们也有两个初始化器,一个用于DictionaryJSONSerialization ,另一个用于JSON的对象SwiftyJSON

    The three approaches will be running 10, 100, 1000, 10,000, and 100,000 times within the measure block in Xcode’s unit test to compare the time consumption:

    这三种方法将运行10100100010,000100,000的范围内多次measure在Xcode的单元测试块进行比较的时候消耗:

    3.结果与分析 (3. Outcome and Analysis)

    Image for post
    Photo by the author (made with VISME).
    作者提供的照片(由VISME制作)。

    SwiftyJSON has the steepest curve of time consumption when the loop accumulates. The data shows it’s three times slower than JSONDecoder and almost six times slower than JSONSerialization when the loop goes to 100,000.

    循环累积时, SwiftyJSON的时间消耗曲线SwiftyJSON陡峭。 数据显示,当循环达到100,000时,它比JSONDecoderJSONDecoder ,比JSONSerializationJSONSerialization

    What makes it so slow?

    是什么让它这么慢?

    SwiftyJSON uses JSONSerialization to deserialize the JSON object:

    SwiftyJSON使用JSONSerialization反序列化JSON对象:

    The bottleneck is obviously in the object mapping and retrieving process. Part of the reason was found when I looked into this line of code:

    瓶颈显然在对象映射和检索过程中。 当我查看以下代码行时,找到了部分原因:

    return type == .array ? rawArray.map { JSON($0)} : nil

    It loops and maps every single object to the JSON object when retrieving values. When we handle nested arrays, the time complexity and space complexity are growing exponentially.

    检索值时,它将循环并将每个对象映射到JSON对象。 当我们处理嵌套数组时,时间复杂度和空间复杂度呈指数增长。

    4。结论 (4. Conclusion)

    Image for post
    Photo by Brina Blum on Unsplash
    Brina BlumUnsplash上的照片

    The raw JSONSerialization approach has outstanding performance but isn’t ideal when dealing with real-world JSON. No one likes chained optional, error-prone, and verbose code:

    原始JSONSerialization方法具有出色的性能,但在处理实际JSON时并不理想。 没有人喜欢链接的可选,容易出错和冗长的代码:

    JSONDecoder is the go-to direction in my opinion due to its beautiful balance of performance and usability:

    我认为JSONDecoder是性能和可用性之间的完美平衡,因此是我的JSONDecoder方向:

    SwiftyJSON has the worst performance and is relatively verbose compared with JSONDecoder. Code like this is better than with raw JSONSerialization but not as clean as with JSONDecoder:

    SwiftyJSON性能最差,并且与JSONDecoder相比比较冗长。 这样的代码是比生吃效果更好JSONSerialization但不作为清洁与JSONDecoder

    In this article, we benchmarked the three approaches. Both the performance and code usability prove it’s time to abandon SwiftyJSON and immigrate to JSONDecoder!

    在本文中,我们对这三种方法进行了基准测试。 性能和代码可用性都证明了该放弃SwiftyJSON并迁移到JSONDecoder

    5.资源 (5. Resources)

    Image for post
    Photo by Olav Ahrens Røtne on Unsplash.
    Olav AhrensRøtneUnsplash拍摄

    All the repo and code mentioned in this article can be found on GitHub.

    本文提到的所有回购和代码都可以在GitHub上找到

    翻译自: https://medium.com/better-programming/time-to-abandon-swiftyjson-switch-jsondecoder-codable-407f9988daec

    swiftyjson

    展开全文
  • SwiftyJSON的使用详解

    千次阅读 2020-12-21 17:18:01
    SwiftyJSON是个使用Swift语言编写的开源库,可以让我们很方便地处理JSON数据(解析数据、生成数据)。 GitHub地址:https://github.com/SwiftyJSON/SwiftyJSON 使用配置:直接将SwiftyJSON.swift添加到项目中即可。...
  • SwiftyJson 的初步理解

    2018-01-09 11:04:08
    SwiftyJson 的初步理解
  • xcode12 导入SwiftyJSON

    2021-01-07 14:13:44
    Xcode12 如何导入第三方库(SwiftyJSON) 废话少说,直接上步骤: 在github上直接下载压缩包:https://github.com/SwiftyJSON/SwiftyJSON 将压缩包解压后直接将解压出的文件拖入到项目中 3. 点击项目,在 ...
  • SwiftyJSON源码分析

    千次阅读 2017-01-14 17:06:27
    Swift3.0 JSON三方库SwiftyJSON源码分析
  • SwiftyJSON 可以让你在 Swift 语言中更好的处理 JSON 数据。示例代码:let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(dataFromTwitter, options: NSJSONReadingOptions....
  • 但第三方开源框架诸如SwiftyJSON的到来,尤其是配合Swift5等以上版本,对应用程序而言数据安全性方面有很大的提升。 SPM导入依赖: https://github.com/SwiftyJSON/SwiftyJSON 使用步骤: 首先先模拟一下JSON数据的...
  • SwiftyJSON SwiftyJSON使您可以轻松地在Swift中处理JSON数据。 平台 建立状态 *操作系统 为什么Swift中典型的JSON处理不好? Swift对类型非常严格。 但是,尽管显式类型可以使我们免于犯错,但在处理JSON和本质上...
  • Swift严格针对类型。 但是,即使显式键入有助于避免犯错误,但是当我们处理JSON和根据定义隐式地涉及类型的其他方面时,显式键入还是很痛苦的。 但是,SwiftyJSON有助于在Swift中使用JSON数据。
  • No such module 'SwiftyJSON'

    2021-01-07 11:57:18
    SwiftyJSON'</strong>. I also get the below warning on Xcode. <p>Target 'Pods-SwiftLocation-iOS' of project 'Pods' was rejected as an implicit dependency for 'Pods_...
  • swift 第三方库SwiftyJSON

    2021-07-22 15:48:20
    pod 'SwiftyJSON' 使用步骤: 首先先模拟一下JSON数据的获取,这里直接定义。 然后把json数据转换成Data。 接着就使用SwiftyJSON直接把数据解析。需要说明的是,如果没有把解析放在if里面那么解析的数据就是...
  • 使用SwiftyJSON解析JSON

    千次阅读 2017-01-04 15:34:29
    SwiftyJSON是一个能帮助我们在Swift中使用JSON的开源类库。开始之前,让我们先看一下在Swift中处理JSON是多么痛苦。 下载地址:https://github.com/lingoer/SwiftyJSON 下面将解析...
  • import SwiftyJSON final class GetResponse : ALSwiftyJSONAble { let url:URL ? let origin: String let args:[ String : String ] ? required init? ( jsonData :JSON){ self . url = jsonData[ " url
  • Swift开发:使用SwiftyJSON解析JSON数据

    千次阅读 2017-10-09 17:29:38
    1 下载配置SwiftyJSON GitHub地址:https://github.com/SwiftyJSON/SwiftyJSON 使用配置:直接将 SwiftyJSON.swift 添加到项目中即  2 解析案例文件  demo.json 放置项目中,json内容如下 { "system": {...
  • [快速学会Swift第三方库] SwiftyJSONSwiftyJSON使得用Swift处理JSON数据更加容易。这是解析JSON字符串封装类。实现功能与JavaScript中的JSON.parse相近,使用方便。 目录 快速学会Swift第三方库 SwiftyJSON篇...
  • ios-swift网络图片轮播-Alamofire请求-SwiftyJSON解析
  • Github的swiftyJson项目的readme文件中复制下面内容到Podfile中 platform :ios, '8.0' use_frameworks! target 'MyApp' do #MyApp--你的项目的名字 pod 'SwiftyJSON', '~> 4.0' end 运行pod update,有可能这...
  • 1,SwiftyJSON介绍与配置 SwiftyJSON是个使用Swift语言编写的开源库,可以让我们很方便地处理JSON数据(解析数据、生成数据)。 GitHub地址:https://github.com/SwiftyJSON/SwiftyJSON 使用配置:直接将...
  • swift 写的小demo Alamofire和SwiftyJSON简单应用 xcode 7.2 iOS 9.2 版本 写的不好莫吐槽,人家正在努力ing
  • SwiftParsingJSONSwiftyJSONExample 使用 SwiftyJSON 库在 Swift 中解析 JSON 的示例项目(经过修改)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,601
精华内容 640
关键字:

swiftyjson