SwiftJSONi
为什么选择 SwiftJSONi?
Swift 中处理 JSON 的传统方法非常繁琐,需要大量的代码。例如,考虑一个来自面包店 API 的 JSON 响应,
{
"items": {
"item": [
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters": {
"batter": [
{ "id": "1001", "type": "Regular" },
{ "id": "1002", "type": "Chocolate" },
{ "id": "1003", "type": "Blueberry" },
{ "id": "1004", "type": "Devil's Food" }
]
},
"topping": [
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5005", "type": "Sugar" },
{ "id": "5007", "type": "Powdered Sugar" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
}
]
}
}
要获取第一件商品中第 4 种装饰的类型,最安全的 Swift 代码如下,
if let json = try? JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) as? [String: Any],
let items = object["items"] as? [String: Any],
let item = items["item"] as? [[String: Any]],
let firstItem = item.first,
let toppings = firstItem["topping"] as? [[String: Any]],
toppings.count >= 3,
let type = toppings[3]["type"] as? String
{
print(type)
}
它涉及到许多类型转换和安全的索引检查,因为 Swift 对类型转换和数组索引策略非常严格。要使用 SwiftJSONi 实现同样的功能,代码如下,
if let json = JSON(data: jsonData),
let type = json["items"]["item"][0]["topping"][3]["type"].string
{
print(type)
}
这就够了!!它既安全又易于阅读。无需担心类型转换和索引检查,这一切都会自动完成。
安装
SwiftJSONi 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'SwiftJSONi'
使用方法
初始化
import SwiftJSONi
let data: Data? // Response from API
let json = JSON(data: data) // Returns JSON?
let any: Any? // Value of Any type
let json = JSON(any) // Returns JSON?
let dictionary: [String: Any]
let json = JSON(dictionary) // Returns JSON
let validatedJSON = JSON(validateObject: dictionary) // Returns JSON?
// Returns 'nil' when a value for key has unsupported JSON type.
访问值
考虑上述示例中的面包店商品JSON。访问第一个商品的 'id' 就像这样,
let firstItem = json["items"]["item"][0]
let id = firstItem["id"].string
.string
和 .stringValue
之间的区别是,
.string
- 如果有可用,则返回 String 值,否则返回 nil
.stringValue
- 如果有可用,则返回 String 值,否则返回默认值即 ""(空字符串)
因此,获取第一个商品的 'ppu' 值如下,
let ppu = firstItem["ppu"].floatValue
方法
对于 String,
string |
如果有可用,则返回 String 值,否则返回 nil |
stringValue |
如果有可用,则返回 String 值,否则返回默认值即 ""(空字符串) |
对于 Int,
int |
如果有可用,则返回 Int 值,否则返回 nil |
intValue |
如果有可用,则返回 Int 值,否则返回默认值即 0 |
对于 Float,
float |
如果有可用,则返回 Float 值,否则返回 nil |
floatValue |
如果有可用,则返回 Float 值,否则返回默认值即 0.0 |
对于 Double,
double |
如果有可用,则返回 Double 值,否则返回 nil |
doubleValue |
如果有可用,则返回 Double 值,否则返回默认值即 0.0 |
对于 Bool,
bool |
如果有可用,则返回 Bool 值,否则返回 nil |
boolValue |
如果有可用,则返回 Bool 值,否则返回默认值即 false |
对于 JSON 对象,
jsonObject |
返回 [String: JSON]? |
jsonObjectValue |
返回 [String: JSON] 否则 [:] |
对于 JSON 数组,
jsonArray |
返回 [JSON]? |
jsonArrayValue |
返回 [JSON] 否则 [] |
对于 Array,
array |
返回 [Any?] |
arrayValue |
返回 [Any?] 否则 [] |
对于 Dictionary,
dictionary |
返回 [String: Any]? |
dictionaryValue |
返回 [String: Any] 否则 [:] |
类型检查
由于JSON是自定义类型,将其转换为原始类型总是会失败,即:
let name = json["name"] as? String // Always fails.
因此也是这样:
if json["name"] is String { // Condition always fails.
// Do something
}
因此,SwiftJSONi使用内置属性来检查值类型。只有这些类型会被JSON接受。任何其他用户定义的类型都不能用作JSON值。
isNull |
如果值是nil ,则返回true 。 |
isString |
如果值是String ,则返回true 。 |
isInt |
如果值是Int ,则返回true 。 |
isFloat |
如果值是Float ,则返回true 。 |
isDouble |
如果值是Double ,则返回true 。 |
isBool |
如果值是Bool ,则返回true 。 |
isJsonObject |
如果值是[String: JSON] ,则返回true 。 |
isJsonArray |
如果值是[JSON] ,则返回true 。 |
isArray |
如果值是[Any?] ,则返回true 。 |
isDictionary |
如果值是[String: Any] ,则返回true 。 |
因此,上述情况可以如下处理:
if json["name"].isString {
// Do something
}
调试
使用debugPrint()
在控制台中美化打印JSON。description
是对应JSON的有效JSON字符串。
作者
Akaash Dev, [email protected]
许可
SwiftJSONi在MIT许可下可用。有关更多信息,请参阅LICENSE文件。