JsonSwiftson 是一个 JSON 解析器,它仅公开了一个 API 方法 map()
,用于将 JSON 属性映射到 Swift 类型。
以下是将 JSON 文本映射到一个 Swift Person
结构体的示例。
struct Person {
let name: String
let age: Int
}
let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }")
let person = Person(
name: mapper["name"].map() ?? "",
age: mapper["age"].map() ?? 0
)
if !mapper.ok { /* report error */ }
您可以将 JsonSwiftson 添加到项目中三种方式之一。
只需将 JsonSwiftson.swift 文件添加到您的 Xcode 项目中。
将以下文本添加到您的 Package.swift 并运行 swift build
。
import PackageDescription
let package = Package(
name: "YourPackageName",
targets: [],
dependencies: [
.Package(url: "https://github.com/evgenyneu/JsonSwiftson.git",
versions: Version(3,0,0)..<Version(4,0,0))
]
)
如果您使用的是较旧的 Swift 版本,请设置库的 早期版本。
1) 如果您使用了 Carthage 或 CocoaPods 设置,请将 import JsonSwiftson
添加到源代码中。
2) 创建一个 JsonSwiftson
类的实例并提供一个 JSON 文本用于解析。
let mapper = JsonSwiftson(json: "{ \"person\": { \"name\": \"Michael\" }}")
3) 提供您想要获取的 JSON 属性名,并调用 map
方法。JSON 值的类型从上下文推断。
let name: String? = mapper["person"]["name"].map()
上述示例将 JSON 映射到了可选 String 类型。可以使用 ??
运算符和非可选映射并提供了默认值。
let name: String = mapper["person"]["name"].map() ?? "Default name"
4) 最后,检查ok
属性以判断映射是否成功。
if !mapper.ok { /* report error */ }
如果JSON解析失败或缺少给定名称的属性,则ok
属性将返回false
。您可以通过向map
方法传入optional: true
参数来允许属性缺失。
let name: String? = mapper["person"]["name"].map(optional: true)
使用map
方法将JSON解析为字符串、数字和布尔值等类型。
// String
let stringMapper = JsonSwiftson(json: "\"Hello World\"")
let string: String? = stringMapper.map()
// Integer
let intMapper = JsonSwiftson(json: "123")
let int: Int? = intMapper.map()
// Double
let doubleMapper = JsonSwiftson(json: "123.456")
let double: Double? = doubleMapper.map()
// Boolean
let boolMapper = JsonSwiftson(json: "true")
let bool: Bool? = boolMapper.map()
使用方括号通过名称访问JSON属性:mapper["name"]
。
let mapper = JsonSwiftson(json: "{ \"name\": \"Michael\" }")
let name: String? = mapper["name"].map()
可以通过多次使用方括号来访问更深层的JSON属性:mapper["person"]["name"]
。
let mapper = JsonSwiftson(json: "{ \"person\": { \"name\": \"Michael\" }}")
let name: String? = mapper["person"]["name"].map()
JsonSwiftson会自动将值映射到字符串、数字和布尔值的数组。
// String
let stringMapper = JsonSwiftson(json: "[\"One\", \"Two\"]")
let string: [String]? = stringMapper.map()
// Integer
let intMapper = JsonSwiftson(json: "[1, 2]")
let int: [Int]? = intMapper.map()
// Double
let doubleMapper = JsonSwiftson(json: "[1.1, 2.2]")
let double: [Double]? = doubleMapper.map()
// Boolean
let boolMapper = JsonSwiftson(json: "[true, false]")
let bool: [Bool]? = boolMapper.map()
使用mapArrayOfObjects
方法与闭包一起映射对象数组。
struct Person {
let name: String
let age: Int
}
let mapper = JsonSwiftson(json:
"[ " +
"{ \"name\": \"Peter\", \"age\": 41 }," +
"{ \"name\": \"Ted\", \"age\": 51 }" +
"]")
let people: [Person]? = mapper.mapArrayOfObjects { j in
Person(
name: j["name"].map() ?? "",
age: j["age"].map() ?? 0
)
}
提示:对于字符串、数字和布尔值等简单值的数组,使用map
方法而不是mapArrayOfObjects
。
struct Person {
let name: String
let age: Int
}
let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }")
let person = Person(
name: mapper["name"].map() ?? "",
age: mapper["age"].map() ?? 0
)
验证ok
属性以查看映射是否成功。如果JSON不正确或存在类型转换问题,映射将失败。
注意:map
和mapArrayOfObjects
方法在映射失败时始终返回nil
。
let successMapper = JsonSwiftson(json: "\"Correct type\"")
let string: String? = successMapper.map()
if successMapper.ok { print("👏👏👏") }
let failMapper = JsonSwiftson(json: "\"Wrong type\"")
let number: Int? = failMapper.map()
if !failMapper.ok { print("🐞") }
如果JSON值为null或属性缺失,则默认映射失败。
提示:传入optional: true
参数以允许缺失的JSON属性和null值。
let mapper = JsonSwiftson(json: "{ }")
let string: String? = mapper["name"].map(optional: true)
if mapper.ok { print("👏👏👏") }
使用map
方法与optional: true
参数和一个闭包来允许空对象。
struct Person {
let name: String
let age: Int
}
let mapper = JsonSwiftson(json: "null") // empty
let person: Person? = mapper.map(optional: true) { j in
Person(
name: j["name"].map() ?? "",
age: j["age"].map() ?? 0
)
}
if mapper.ok { print("👏👏👏") }
如果您需要映射到类似于let number: Int
的非可选类型,在mapper后面使用??
运算符。
let numberMapper = JsonSwiftson(json: "123")
let number: Int = numberMapper.map() ?? 0
let arrayMapper = JsonSwiftson(json: "[1, 2, 3]")
let numbers: [Int] = arrayMapper.map() ?? []
本项目包括一个运行性能基准测试的演示应用程序。该程序映射包含100个记录的大型JSON文件。该过程重复100次。
以下是一些出色的库列表,可以帮助您在Swift中控制JSON。
JsonSwiftson遵循MIT许可。