解析后JSON结果为零

时间:2017-02-09 02:26:55

标签: ios json swift3 xcode8

我正在尝试从JSON序列化中提取值,但结果是 nil

应用程序正在Swift2下工作,因此转换到问题开始的Swift 3。

let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
print(jsonResult!)
let mySuccess = jsonResult?["success"] as? Int
print (mySuccess!)

print(jsonResult!)提供以下输出

{
"full_login" = 0;
"logged_in" = 1;
message = "<null>";
success = 1;
}

所以到目前为止一切都很好,我的解析工作正常,我现在有来自服务器的数据。

然而 print(mySuccess!)提供此输出

  

致命错误:在解包可选值时意外发现nil

所以我理解输出说代码在展开时发现为零,所以我现在的问题是如何提取“Success”键的值,因为它在Swift 2下运行但是现在在Swift 3下不是这样吗?

更新

Sneak发现一个可能的问题,即成功= 1没有“”,所以一旦我调查就会更新问题答案。

3 个答案:

答案 0 :(得分:1)

您可以使用 OPTIONAL BINDING 的概念来检查nil值。

let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
print(jsonResult!)
if let mySuccess = jsonResult?["success"] as? Bool 
{
print (mySuccess)
}
else
{
print ("Found nil")
}

答案 1 :(得分:0)

success = 1;的打印日志表明jsonResult?["success"]不是nil。 JSONSerialization.jsonObject只能返回三个显示为1的内容:字符串,数字或值true。当您尝试将其展开为Int并且失败时,唯一的可能性就是它是StringBool

你可能有success

"success": true

或者:

"success": "1"

因此,您可能想要这样做:

let mySuccess = jsonResult?["success"] as? Bool

或者:

let mySuccess = jsonResult?["success"] as? String

或者要求更改后端API响应。

答案 2 :(得分:0)

好的,所以评论非常有帮助,帮助我磨练了问题。我开始看着失踪的&#34;&#34;但是注意到当我输入以下代码时:

for (key, value) in jsonResult!
{
  print (key)
  print (value)
}

我得到以下输出

logged_in
1
full_login
0
success
1
message
<null>

因此必须有一种方法来获得成功的价值 This page最终给了我解决方案。 我不得不使用以下代码:

let myResult = (jsonResult?["success"])
print("SUCCESS VALUE >> ", myResult!)

现在这给了我 1 的值,并且全部解决了。 再次感谢他们帮助的评论。

然后我遇到了没有意识到成功价值是Bool的问题所以我不得不使用以下代码来检查是真是假:

 if (jsonResult?["success"] as? Bool)!
 {
     okToLogIn = true
     print(okToLogIn)
 }
     else
 {
     okToLogIn = false
     print(okToLogIn)
  }

现在所有优秀的应用程序都在Swift 3下再次运行。