SwiftyJSON 中文介绍

SwiftyJSON makes it easy to deal with JSON data in Swift.

  1. Why is the typical JSON handling in Swift NOT good
  2. Requirements
  3. Integration
  4. Usage
  5. Work with Alamofire

Why is the typical JSON handling in Swift NOT good?

Swift is very strict about types. But although explicit typing is good for saving us from mistakes, it becomes painful when dealing with JSON and other areas that are, by nature, implicit about types.

Take the Twitter API for example. Say we want to retrieve a user‘s "name" value of some tweet in Swift (according to Twitter‘s API https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline).

The code would look like this:

let JSONObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil)

if let statusesArray = JSONObject as? [AnyObject],
   let status = statusesArray[0] as? [String: AnyObject],
   let user = status["user"] as? [String: AnyObject],
   let username = user["name"] as? String {
    // Finally we got the username
}

It‘s not good.

Even if we use optional chaining, it would be messy:

let JSONObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil)

if let username = (((JSONObject as? [AnyObject])?[0] as? [String: AnyObject])?["user"] as? [String: AnyObject])?["name"] as? String {
    // What a disaster
}

An unreadable mess--for something that should really be simple!

With SwiftyJSON all you have to do is:

let json = JSON(data: dataFromNetworking)
if let userName = json[0]["user"]["name"].string{
  //Now you got your value
}

And don‘t worry about the Optional Wrapping thing. It‘s done for you automatically.

let json = JSON(data: dataFromNetworking)
if let userName = json[999999]["wrong_key"]["wrong_name"].string{
    //Calm down, take it easy, the ".string" property still produces the correct Optional String type with safety
} else {
    //Print the error
    println(json[999999]["wrong_key"]["wrong_name"])
}

Requirements

  • iOS 7.0+ / Mac OS X 10.9+
  • Xcode 6.1

Integration

CocoaPods (iOS 8+, OS X 10.9+)

You can use Cocoapods to install SwiftyJSONby adding it to your Podfile:

platform :ios, ‘8.0‘
use_frameworks!

target ‘MyApp‘ do
    pod ‘SwiftyJSON‘, ‘~> 2.2.0‘
end

Note that it needs you to install CocoaPods 36 version, and requires your iOS deploy target >= 8.0:

Carthage (iOS 8+, OS X 10.9+)

You can use Carthage to install SwiftyJSON by adding it to your Cartfile:

github "SwiftyJSON/SwiftyJSON" >= 2.2.0

Manually (iOS 7+, OS X 10.9+)

To use this library in your project manually you may:

  1. for Projects, just drag SwiftyJSON.swift to the project tree
  2. for Workspaces, include the whole SwiftyJSON.xcodeproj

Usage

Initialization

import SwiftyJSON
let json = JSON(data: dataFromNetworking)
let json = JSON(jsonObject)
if let dataFromString = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) {
    let json = JSON(data: dataFromString)
}

Subscript

//Getting a double from a JSON Array
let name = json[0].double
//Getting a string from a JSON Dictionary
let name = json["name"].stringValue
//Getting a string using a path to the element
let path = [1,"list",2,"name"]
let name = json[path].string
//Just the same
let name = json[1]["list"][2]["name"].string
//Alternatively
let name = json[1,"list",2,"name"].string
//With a hard way
let name = json[].string
//With a custom way
let keys:[SubscriptType] = [1,"list",2,"name"]
let name = json[keys].string

Loop

//If json is .Dictionary
for (key: String, subJson: JSON) in json {
   //Do something you want
}

The first element is always a String, even if the JSON is an Array

//If json is .Array
//The `index` is 0..<json.count‘s string value
for (index: String, subJson: JSON) in json {
    //Do something you want
}

Error

Use a subscript to get/set a value in an Array or Dictionary

If the json is:

  • an array, the app may crash with "index out-of-bounds."
  • a dictionary, it will get nil without a reason.
  • not an array or a dictionary, the app may crash with an "unrecognised selector" exception.

It will never happen in SwiftyJSON.

let json = JSON(["name", "age"])
if let name = json[999].string {
    //Do something you want
} else {
    println(json[999].error) // "Array[999] is out of bounds"
}
let json = JSON(["name":"Jack", "age": 25])
if let name = json["address"].string {
    //Do something you want
} else {
    println(json["address"].error) // "Dictionary["address"] does not exist"
}
let json = JSON(12345)
if let age = json[0].string {
    //Do something you want
} else {
    println(json[0])       // "Array[0] failure, It is not an array"
    println(json[0].error) // "Array[0] failure, It is not an array"
}

if let name = json["name"].string {
    //Do something you want
} else {
    println(json["name"])       // "Dictionary[\"name"] failure, It is not an dictionary"
    println(json["name"].error) // "Dictionary[\"name"] failure, It is not an dictionary"
}

Optional getter

//NSNumber
if let id = json["user"]["favourites_count"].number {
   //Do something you want
} else {
   //Print the error
   println(json["user"]["favourites_count"].error)
}
//String
if let id = json["user"]["name"].string {
   //Do something you want
} else {
   //Print the error
   println(json["user"]["name"])
}
//Bool
if let id = json["user"]["is_translator"].bool {
   //Do something you want
} else {
   //Print the error
   println(json["user"]["is_translator"])
}
//Int
if let id = json["user"]["id"].int {
   //Do something you want
} else {
   //Print the error
   println(json["user"]["id"])
}
...

Non-optional getter

Non-optional getter is named xxxValue

//If not a Number or nil, return 0
let id: Int = json["id"].intValue
//If not a String or nil, return ""
let name: String = json["name"].stringValue
//If not a Array or nil, return []
let list: Array<JSON> = json["list"].arrayValue
//If not a Dictionary or nil, return [:]
let user: Dictionary<String, JSON> = json["user"].dictionaryValue

Setter

json["name"] = JSON("new-name")
json[0] = JSON(1)
json["id"].int =  1234567890
json["coordinate"].double =  8766.766
json["name"].string =  "Jack"
json.arrayObject = [1,2,3,4]
json.dictionary = ["name":"Jack", "age":25]

Raw object

let jsonObject: AnyObject = json.object
if let jsonObject: AnyObject = json.rawValue
//convert the JSON to raw NSData
if let data = json.rawData() {
    //Do something you want
}
//convert the JSON to a raw String
if let string = json.rawString() {
    //Do something you want
}

Literal convertibles

For more info about literal convertibles: Swift Literal Convertibles

//StringLiteralConvertible
let json: JSON = "I‘m a json"
//IntegerLiteralConvertible
let json: JSON =  12345
//BooleanLiteralConvertible
let json: JSON =  true
//FloatLiteralConvertible
let json: JSON =  2.8765
//DictionaryLiteralConvertible
let json: JSON =  ["I":"am", "a":"json"]
//ArrayLiteralConvertible
let json: JSON =  ["I", "am", "a", "json"]
//NilLiteralConvertible
let json: JSON =  nil
//With subscript in array
var json: JSON =  [1,2,3]
json[0] = 100
json[1] = 200
json[2] = 300
json[999] = 300 //Don‘t worry, nothing will happen
//With subscript in dictionary
var json: JSON =  ["name": "Jack", "age": 25]
json["name"] = "Mike"
json["age"] = "25" //It‘s OK to set String
json["address"] = "L.A." // Add the "address": "L.A." in json
//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"

Work with Alamofire

SwiftyJSON nicely wraps the result of the Alamofire JSON response handler:

Alamofire.request(.GET, url, parameters: parameters)
  .responseJSON { (req, res, json, error) in
    if(error != nil) {
      NSLog("Error: \(error)")
      println(req)
      println(res)
    }
    else {
      NSLog("Success: \(url)")
      var json = JSON(json!)
    }
  }

https://github.com/SwiftyJSON/SwiftyJSON
时间: 2024-10-15 02:05:27

SwiftyJSON 中文介绍的相关文章

【Java】Appache Flume 中文介绍

 Flume 是什么        Apache Flume是一个高可靠.高可用的分布式的海量日志收集.聚合.传输系统.它可以从不同的日志源采集数据并集中存储. Flume也算是Hadoop生态系统的一部分,源于Cloudera,目前是Apache基金会的顶级项目之一.Flume有两条产品线,0.9.x版本和1.x版本. 官网:http://flume.appache.org/ 收集.聚合事件流数据的分布式框架 通常用于log数据 采用ad-hoc方案,明显优点如下: 可靠的.可伸缩.可管理

[Arduino] Leonardo 中文介绍

以下内容均翻译自arduino.cc,水平有限,如有错误请大家指正. 概述Arduino Leonardo是基于ATmega32u4一个微控制器板.它有20个数字输入/输出引脚(其中7个可用于PWM输出.12个可用于模拟输入),一个 16 MHz的晶体振荡器,一个Micro USB接口,一个DC接口,一个ICSP接口,一个复位按钮.它包含了支持微控制器所需的一切,你可以简单地通过把它连接到计算机的USB接口,或者使用 AC-DC适配器,再或者用电池来驱动它.Leonardo不同于之前所有的ard

【转】ContentProvider中文介绍

ContentProvider测试 ContentProvider是Android API的一个重要部分,它存贮和检索数据,使得数据可以跨应用程序访问.作为一个应用程序开发者,你可以提供自己的公共prividers给其他应用程序使用.如果你这样做了,那你应该使用你发布的API来测试他们. 该文档描述了如何测试公共的ContentProvider,但是也同样适用于应用程序私有的providers.如果你不熟悉ContentProvider或者Android测试框架,请先阅读ContentProvi

PHP爬虫最全总结2-phpQuery,PHPcrawer,snoopy框架中文介绍

1.几种常用的PHP爬虫框架对比 原文链接:https://blog.csdn.net/future_todo/article/details/52804440 1.1 phpQuery 优势:类似jquery的强大搜索DOM的能力. pq()是一个功能强大的搜索DOM的方法,跟jQuery的$()如出一辙,jQuery的选择器基本上都能使用在phpQuery上,只要把"."变成"->",Demo如下(对应我的github的Demo5) <?php re

iOS 天气应用代码中文介绍,ios代码

天气应用 解释请求参数 q: 表示Location(可以给出城市名字;或者直接给城市的经纬度) 例子:q=beijing 例子 q=48.834,2.394 num_of_days: 需要预报的天数 例子:num_of_days=2 tp: 每隔几小时的天气预报 例子:tp=1; tp=3(缺省); tp=6; tp=12; tp=24 key: 注册成功后的钥匙 例子: key=61dcb484acc1f6cfb08aad9c4ac3d939 format: 返回的数据格式 例子:format

[Arduino] Arduino Uno R3 中文介绍

Arduino UNO是Arduino USB接口系列的最新版本,作为Arduino平台的参考标准模板.UNO的处理器核心是ATmega328,同时具有14路数字输入/输出口(其中6路可作为PWM输出),6路模拟输入,一个16MHz晶体振荡器,一个USB口,一个电源插座,一个ICSP header和一个复位按钮.UNO已经发布到第三版,与前两版相比有以下新的特点: 在AREF处增加了两个管脚SDA和SCL,支持I2C接口:增加IOREF和一个预留管脚,将来扩展板将能兼容5V和3.3V核心板. 改

MooTools中文介绍

MooTools是一个简洁,模块化,面向对象的JavaScript框架.它能够帮助你更快,更简单地编写可扩展和兼容性强的JavaScript代码. Mootools从Prototype.js中汲取了许多有益的设计理念,语法也和其极其类似.但它提供的功能要比Prototype.js多,整体设计也比Prototype.js要相对完善,功能更强大,比如增加了动画特效.拖放操作等等.www.82676666.com 总之,Mootools是一个非常优秀的Javascript框架,更多精髓部分等待你去发掘

iOS 天气应用代码中文介绍

天气应用 解释请求参数 q: 表示Location(可以给出城市名字;或者直接给城市的经纬度) 例子:q=beijing 例子 q=48.834,2.394 num_of_days: 需要预报的天数 例子:num_of_days=2 tp: 每隔几小时的天气预报 例子:tp=1; tp=3(缺省); tp=6; tp=12; tp=24 key: 注册成功后的钥匙 例子: key=61dcb484acc1f6cfb08aad9c4ac3d939 format: 返回的数据格式 例子:format

Appache Flume 中文介绍(转)

Flume 是什么        Apache Flume是一个高可靠.高可用的分布式的海量日志收集.聚合.传输系统.它可以从不同的日志源采集数据并集中存储. Flume也算是Hadoop生态系统的一部分,源于Cloudera,目前是Apache基金会的顶级项目之一.Flume有两条产品线,0.9.x版本和1.x版本. 官网:http://flume.appache.org/ 收集.聚合事件流数据的分布式框架 通常用于log数据 采用ad-hoc方案,明显优点如下: 可靠的.可伸缩.可管理.可定