2

我正在创建像这样工作的简单 Json Parser:我有包含 Anyobject 作为数据的 JsonData 类。当我使用 jsonData["key"] 它返回 JsonData 我可以链接 jsonData["key"]["key2"] 等。

我的问题是如何实现该类,以便可以将其转换为字符串:

jsonData["key"] as String 不使用一些解决方法

jsonData["key"].data 作为字符串

代码:

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

}
4

1 回答 1

0

为了做到这一点,您需要添加另一个重载,但它不会像您想的那样工作。

subscript(key: String) -> String {
    let newData = data as! [String:AnyObject]
    return newData[key] as! String
}

所以 thenjsonData["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.

于 2016-07-18T16:25:43.480 回答