将json变量转换为快速变量

时间:2016-01-04 12:32:48

标签: json swift

我的PHP服务器端返回如下的JSON:

[{"scan_status":"ok","visitorData":[{"visitorCompany":"xyl","visitorStreet":"street","visitorBranche":"health","visitorEmail":"wesweatyoushop@gmail.com","lastmodified":"2014-12-15 14:18:55"}]}]

现在在Swift中我想存储这些数据,为此我试图将数据解析为Swift变量,但是我被卡住了。

do {
    //check wat we get back
    let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves )
    let vData = jsonData[0]["visitorData"]
    //let vCompany = vData["visitorCompany"]
    print("Test vData: \(vData)")
}

打印

Test vData: Optional(( { visitorStreet = street; visitorPhone = 01606478; visitorCompany = xyl; visitorBranche = Sports; visitorEmail = "health@gmail.com"; lastmodified = "2014-12-15 14:18:55"; } ))

但是当我尝试使用

获取visitorCompany
let vCompany = vData["visitorCompany"]

我收到编译错误:

  

无法下标'AnyObject?'类型的值索引类型为'String'

顺便说一句,为什么我们在swift中看到等号,即visitorStreet = street

3 个答案:

答案 0 :(得分:2)

这是因为编译器不知道解码对象的类型。

帮助编译器使用if let

进行转换
do {
    let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves )
    if let vData = jsonData[0]["visitorData"] as? [[String:AnyObject]] {
        if let vCompany = vData[0]["visitorCompany"] {
            print(vCompany)
        }
    }
}

答案 1 :(得分:1)

let vData = jsonData[0]["visitorData"]使用通用vData填充AnyObject?,因为Swift无法知道PHPJSON中返回的对象类型vData

您需要先使用optional cast到另一个字典,然后才能使用jsonData[0]["visitorData"] as? [String:AnyObject]if let vData = jsonData[0]["visitorData"] as? [String:AnyObject] { //let vCompany = vData["visitorCompany"] print("Test vData: \(vData)") }

因为条件转换会返回一个可选项,所以最好先执行optional binding来解包该可选项,从而生成与此类似的代码:

json

甚至更好,因为jsonData不能是一个数组,或者它可能是一个空数组(服务器出现故障并发送无效的if let items = jsonData as? [[String:AnyObject]], vData = items.first?["visitorData"] { //let vCompany = vData["visitorCompany"] print("Test vData: \(vData)") } ),你可以进一步验证:

items = jsonData as? [[String:AnyObject]]
如果jsonData不是数组,则{p> vData = items.first?["visitorData"]会失败,而items.first如果items.first为零(optional chaining此处),或visitorData,则ProcessID会失败}没有@echo off set "ProcessID=" for /F "usebackq skip=1 delims=" %%I in (`wmic process where "Name like '%%cmd.exe%%' and CommandLine like '%%WatchdogStarter.bat%%'" get processid 2^>nul`) do set "ProcessID=%%I" if "%ProcessID%" == "" ( echo PID could not be determined. ) else ( echo PID is: %ProcessID% ) 密钥。

答案 2 :(得分:-1)

试试这个:

let vData = jsonData[0]["visitorData"]![0] as! [String:AnyObject]