使用 Json Stream 进行反序列化

代码如下:

import encoding.json.stream.* import std.io.* import std.collection.* class A <: JsonDeserializable<A> { var key1: Option<String> = None var key2: Bool = false var key3: Float64 = 0.0 var key4: String = "" var key5: Array<Int64> = Array<Int64>() var key6: HashMap<String, String> = HashMap<String, String>() public static func fromJson(r: JsonReader): A { var res = A() while (let Some(v) <- r.peek()) { match(v) { case BeginObject => r.startObject() while(r.peek() != EndObject) { let n = r.readName() match (n) { case "key1" => res.key1 = r.readValue<Option<String>>() case "key2" => res.key2 = r.readValue<Bool>() case "key3" => res.key3 = r.readValue<Float64>() case "key4" => res.key4 = r.readValue<String>() case "key5" => res.key5 = r.readValue<Array<Int64>>() case "key6" => res.key6 = r.readValue<HashMap<String, String>>() case _ => () } } r.endObject() break case _ => throw Exception() } } return res } func toString(): String { return "${key1}\n${key2}\n${key3}\n${key4}\n${key5}\n${key6}" } } main() { let jsonStr = ##"{"key1": null, "key2": true, "key3": 123.456, "key4": "string", "key5": [123, 456], "key6": {"key7": " ", "key8": "\\a"}}"## var bas = ByteArrayStream() unsafe { bas.write(jsonStr.rawData()) } var reader = JsonReader(bas) var obj = A.fromJson(reader) println(obj.toString()) }

运行结果如下:

None true 123.456000 string [123, 456] [(key7, ), (key8, \a)]