我的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"]
我收到编译错误:
顺便说一句,为什么我们在swift中看到等号,即无法下标'AnyObject?'类型的值索引类型为'String'
visitorStreet = street
?
答案 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
无法知道PHP
在JSON
中返回的对象类型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]