Swift中的安全动态JSON转换

时间:2015-06-28 13:06:22

标签: json swift casting rtti

我怀疑我不太喜欢Swift 1.2,我需要更多的RTFM。

我正在开发一个从URI读取JSON数据的Swift应用程序。

如果JSON数据不好或不存在,则没有问题。 JSON对象永远不会实例化。

但是,如果JSON数据是好JSON,但不是我想要的,对象实例化,但包含的结构不是我想要的结果,我得到运行时错误。

我看过使用Swift" RTTI" (dynamicType),但总是返回"< Swift.AnyObject>",无论数据是什么。

我希望JSON是一种特定的格式:字典数组:

[[String:String]]! JSON: [{"key":"value"},{"key","value"},{"Key":"value"}]

如果我喂它一个元素:

{"Key":"value"}

我试图施放它的例程,但失败了。

我想测试JSON对象,以确保它在转换之前具有我想要的结构。

    if(nil != inData) {
        let rawJSONObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(inData, options: nil, error: nil)
        println("Type:\(rawJSONObject.dynamicType)")
        if(nil != rawJSONObject) {
            // THE LINE BELOW BLOWS UP IF I FEED IT "BAD/GOOD" JSON:
            let jsonObject: [[String:String]]! = rawJSONObject as! [[String:String]]!
            // I NEED TO TEST IT BEFORE DOING THE CAST
            if((nil != jsonObject) && (0 < jsonObject.count)) {
                let jsonDictionary: [String:String] = jsonObject[0]
                if("1" == jsonDictionary["semanticAdmin"]) { // We have to have the semantic admin flag set.
                    let testString: String!  = jsonDictionary["versionInt"]

                    if(nil != testString) {
                        let version = testString.toInt()

                        if(version >= self.s_minServerVersion) {    // Has to be a valid version for us to pay attention.
                            self.serverVersionAsInt = version!
                        }
                    }
                }
            }
        }
    }

我的问题是,是否有一种很好的方法在uwinding / cast之前测试JSON结构的NSJSONSerialization响应?

我觉得好像this question可能更接近我需要的东西,但我遇到了麻烦&#34;施放&#34;这是我目前的问题。

1 个答案:

答案 0 :(得分:2)

您可以使用安全展开来测试原始对象的类型,例如:

if let jsonObject = rawJSONObject as? [[String:String]] {
    // jsonObject is an array of dictionaries
} else if let jsonObject = rawJSONObject as? [String:String] {
    // jsonObject is a dictionary
    // you can conform it as you wish, for example put it in an array
} else {
    // fail, rawJSONObject is of another type
}

目前,您的代码崩溃是因为强制解包,!,如果转换失败,则值为nil。