JsonSerialize -
MIT
OS X
Swift
软件简介
JsonSerialize 是提供安全的方法来编码和解码 Swift 对象为 JSON。
示例:
class TestSubStruct: ToJson, FromJson {
let foo = "bar"
init(foo: String) {
self.foo = foo
}
func toJson() -> Json {
return Json.Object(["foo": foo.toJson()])
}
class func fromJson(json: Json) -> TestSubStruct? {
let decoder = JsonDecoder(json: json)
if let value: String = decoder.readValue("foo") {
return TestSubStruct(foo: value)
}
return nil
}}class TestStruct: ToJson, FromJson {
let int = 123
let float = 123.0
let string = "foo"
let bool = true
let array = ["foo"]
var dict = ["foo": "bar"]
var sub = TestSubStruct(foo: "bar")
init() {}
init(json: Json) {
let decoder = JsonDecoder(json: json)
int = decoder.readValue("int")!
float = decoder.readValue("float")!
string = decoder.readValue("string")!
bool = decoder.readValue("bool")!
array = decoder.readArray("array")!
dict = decoder.readDictionary("dict")!
sub = decoder.readValue("sub")!
}
func toJson() -> Json {
let json = [
"int": int.toJson(),
"float": float.toJson(),
"string": string.toJson(),
"bool": bool.toJson(),
"array": Json.fromArray(array),
"dict": Json.fromDictionary(dict),
"sub": sub.toJson(),
"null": Json.Null
]
return Json.Object(json)
}
class func fromJson(value: Json) -> TestStruct? {
return value.object ? TestStruct(json: value) : nil
}}class JsonSerializeTests: XCTestCase {
func testJsonEncode() {
let testObject = TestStruct()
let expected = "{\"int\":123.0,\"bool\":true,\"null\":null," +
"\"array\":[\"foo\"],\"dict\":{\"foo\":\"bar\"}," +
"\"float\":123.0,\"string\":\"foo\",\"sub\":{\"foo\":\"bar\"}}"
let encoded = testObject.toJson().toString()
XCTAssert(encoded == expected, "Invalid JSON: \(encoded)")
}
func testJsonEncodeOptional() {
var test: Int?
XCTAssert(Json.fromOptional(test).toString() == "null", "Should be Null")
test = 10
XCTAssert(Json.fromOptional(test).toString() == "10.0", "Should be 10.0")
}
func testJsonDecode() {
let jsonString = "{\"int\":321.0,\"bool\":false," +
"\"array\":[\"bar\"],\"dict\":{\"bar\":\"baz\"}," +
"\"float\":321.0,\"string\":\"bar\",\"sub\":{\"foo\":\"bar\"}}"
let decoder = JsonDecoder(jsonString: jsonString)
let decoded = TestStruct(json: decoder.json)
XCTAssert(decoded.int == 321, "Invalid int value")
XCTAssert(decoded.bool == false, "Invalid bool value")
XCTAssert(decoded.array == ["bar"], "Invalid array value")
XCTAssert(decoded.dict == ["bar": "baz"], "Invalid dic value")
XCTAssert(decoded.float == 321.0, "Invalid float value")
XCTAssert(decoded.string == "bar", "Invalid string value")
XCTAssert(decoded.sub.foo == "bar", "Invalid sub value")
}}