SwiftyJSON的使用方法

描述: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)
            }
        }
    }
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,609评论 4 59
  • 本文详细讲解了 Gitbook 生成电子书的完整过程,内容包括:安装、命令、配置、文档结构、生成电子书、部署。限于...
    静默虚空阅读 11,131评论 9 138
  • 基础太差,从头再来!从http到socket。 http请求解析 请求报文分为三部分:请求行、请求头、请求体 如图...
    咸鱼而已阅读 525评论 0 0
  • 先有意义,再有条理!【51】 “反思”如何将想法转化为行动,以及反思的3个问句。想法和杂事,是不可以被管理的,我们...
    朱进伟西农阅读 744评论 0 2