DirectJSON

安装和使用

一个 Swift 包,使您能够像在 JavaScript 中一样直观地使用 JSON。只需使用点来访问 JSON 结构,就像这样

let brand : String? = theCarsOf2023.json.ev.popular[0].brand

无需过多学习

DirectJSON 将扩展 String 类型,您将能够通过 .json 属性访问 JSON String 的任何部分。它使用 @dynamicMemberLookup 来解码您想要访问的路径。

您可以使用任何有效的 JSON String。 让我们看看以下内容

// This is our JSON String 
let countryData = "{\"name\" : \"Türkiye\", \"facts\" : {\"population\" : 85000000, \"GDP\" : 815} , \"tags\" : [\"Europe\", \"Asia\", \"Middle East\"] }"
                  
            
//Access a property value
let name : String? = countryData.json.name
            
//Access a property value as any Codable Swift Type
let population : Int? = countryData.json.facts.population
            
//Access a property using a custom Decoder
let population : Int? = countryData.json.facts.population.jsonDecode(myCustomDecoder)
            
//You can convert the JSON String directly to any Codable Swift Type
let country : Country? = countryData.json.jsonDecode()
            
//Access array values using index
let firstTag : String? = countryData.json.tags[0]

安装和使用

DirectJSON 使用 Swift Package Manager,并支持所有平台,像添加任何其他包一样将其添加到您的项目中。

使用 Xcode

在 Xcode 中,点击 File->Add Packages...

在右上角,有一个文本框,上面写着 Search or Enter Package URL

复制并粘贴 https://github.com/mrtksn/DirectJSON.git 到其中。等待包数据加载完成,然后单击 Add Package 按钮。按照说明完成添加包。

使用 Package.swift

或者,您可以通过编辑您的 Package.swift 文件来添加包。在您的 dependencies 中,按此处所示添加 URL。

// swift-tools-version:4.0
import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    dependencies: [
        .package(url: "https://github.com/mrtksn/DirectJSON.git", from: "1.0.0"),
    ]
)

然后运行 swift build 命令。

如何使用

添加包后,您可以简单地包含该包并开始像这样使用它

import DirectJSON

// ready to use. Just add .json to any String to access the functions

let stars : Int? = "{\"stars\" : 10}".json.stars
// result: Optional(10)

附带一些工具

以下 API 可能有助于简化您的工作流程

将任何 Swift 对象(符合 Codable 协议)转换为 String

 let car = try? JSON.encode(someCarObject)
 // result: {"brand" : "Tesla", "type" : "ev"}

将 JSON String 的一部分作为 String 获取

let evs = theCarsOf2023.json.ev.stringify()
// result: {"popular" : [car1, car2 ...], "topSpeed" : [car9, car3 ...]}

Cookbook (示例)

Swift 是一种类型语言,JavaScript 以及 JSON 则不是。这在从 JavaScript 转换为 Swift 时会造成困难。

在这里,我们将列出解决此类常见问题的一些想法。

处理包含多种类型的数组

let jobDescription = "{\"title\" : \"developer\", \"tags\" : [\"php\", \"js\", \"swift\", 2022, 2023]}"
                
var years = [Int]()
                
switch jobDescription.json.tags{
    case .arrayType(let arr):
        years = arr.compactMap({ $0.getValue() as? Double }).map({Int($0)})
    default:
        break
}
print("years:", years)
//result: years: [2022, 2023]

局限性

目前不支持碎片化的 JSON。 这是因为 Apple 的 JSONDecode 也不支持 JSON 片段。