我正在创建简单的Json Parser,它的工作原理如下:我有一个包含Anyobject作为数据的JsonData类。当我使用jsonData [" key"]时,它返回JsonData,我可以链接jsonData [" key"] [" key2"]等。
我的问题是如何实现该类,以便我可以将其转换为String:
jsonData [" key"] as String,不使用像
这样的工作区jsonData [" key"]。data as String
代码:
class JsonData:CustomStringConvertible{
let data:AnyObject
var description: String{
get{
return "\(data)"
}
}
init(_ data: Data) {
self.data = try! JSONSerialization.jsonObject(with: data, options: []) as! [[String:AnyObject]]
}
init(_ data: AnyObject) {
self.data = data
}
subscript(key:String) -> JsonData{
let newData = data as! [String:AnyObject]
let test = newData[key]!
return JsonData(test)
}
subscript(index:Int) ->JsonData{
let newData = data[index]!
return JsonData(newData)
}
}
答案 0 :(得分:0)
为了做到这一点,你要添加另一个重载,但它不会像你一样思考。
subscript(key: String) -> String {
let newData = data as! [String:AnyObject]
return newData[key] as! String
}
然后jsonData["key"] as String
有效,但jsonData["key"]["key2"]
含糊不清,你必须写(jsonData["key"] as JsonData)["key2"]
,这可能不是你想要的。
对此的简短回答是不要这样做。如果您需要这么多JSON访问权限,那么您可能错误地存储了数据。尽可能快地将其解析为结构,然后使用结构。如果需要,将结构转换回JSON。 AnyObject的广泛工作将会一次又一次地破坏你的大脑和编译器。 AnyObject是一个必要的邪恶,而不是每天的工具。很快你会遇到那个可怕的日子,你有一个AnyObject?
而且编译器只是流下了眼泪。好吧,至少它不是Any
。
暂且不谈,更好的解决方案是使用带标签的下标。
subscript(string key: String) -> String {
let newData = data as! [String:AnyObject]
return newData[key] as! String
}
现在,您可以将其作为json[string: "key"]
而不是json["key"] as String
进行访问。