JSONElement
is a simple, fast and secure way to access Json.
Because Any
can't be used in Codable
, it can be replaced with JSONElement
for properties of type Any
.
Add the dependency in your Package.swift
file:
let package = Package(
name: "myproject",
dependencies: [
.package(url: "https://github.com/TBXark/JSONElement.git", .upToNextMajor(from: "1.4.0"))
],
targets: [
.target(
name: "myproject",
dependencies: ["JSONElement"]),
]
)
Add the dependency in your Cartfile
file:
github "TBXark/JSONElement" ~> 1.4.0.
Add the dependency in your Podfile
file:
pod 'JSONElement'
final class JSONElementTests: XCTestCase {
struct Human: Codable {
let age: Int
let name: String
let height: Double
let extra: JSONElement // Any?
}
let dict = ["data": ["man": ["age": 10, "name": "Peter", "height": 180.0, "extra": [123, "123", [123], ["123": 123], true]]]]
func testJSONElement() throws {
let json = try JSONElement(rawJSON: dict)
// 使用dynamicMemberLookup直接获取
XCTAssertEqual(json.data.man.age.intValue, 10)
// 使用Key获取
XCTAssertEqual(json["data"]["man"]["height"].decimalValue, 180.0)
// 使用Keypath获取
XCTAssertEqual(json[keyPath: "data.man.name"].stringValue, "Peter")
// 将不确定类型对象解析为JSONElement
XCTAssertEqual(json.data.man.extra.arrayValue?.first?.intValue , 123)
XCTAssertEqual(try? json.data.man.extra.arrayValue?.last?.as(Bool.self), true)
}
func testJSONMapper() throws {
let json = JSONMapper(dict)
// 使用 dynamicMemberLookup 获取
XCTAssertEqual(json.data.man.height.as(Double.self), 180.0)
// 使用Key获取
XCTAssertEqual(json["data"]["man"]["age"].intValue, 10)
XCTAssertEqual(json["data"]["man"]["height"].as(Double.self), 180.0)
// 使用Keypath获取
XCTAssertEqual(json[keyPath: "data.man.name"].as(String.self), "Peter")
// 将不确定类型对象解析为JSONElement
XCTAssertEqual(try? json[keyPath: "data.man.extra"].as(JSONElement.self)?.arrayValue?.last?.as(Bool.self), true)
}
static var allTests = [
("testJSONElement", testJSONElement)
("testJSONMapper", testJSONMapper),
]
}