一个 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 ...]}
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 片段。