SwiftJSONi 0.1.1

SwiftJSONi 0.1.1

Akaash Dev 维护。



SwiftJSONi

CI Status Version License Platform

为什么选择 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文件。