Skip to content

TBXark/JSONElement

Repository files navigation

JSONElement

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.

Installation

Swift Package Manager

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"]),
        ]
)

Carthage

Add the dependency in your Cartfile file:

github "TBXark/JSONElement" ~> 1.4.0.

CocoaPods

Add the dependency in your Podfile file:

pod 'JSONElement'

Example

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),
    ]
}