【问题标题】:JSON result nil after parsing解析后JSON结果为零
【发布时间】:2017-02-09 02:26:54
【问题描述】:

我正在尝试从 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

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

更新

Sneak 发现了一个可能的问题,即成功 = 1 没有“”,因此我会在调查后更新问题答案。

【问题讨论】:

标签: ios json swift3 xcode8


【解决方案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")
}

【讨论】:

    【解决方案2】:

    好的,所以 cmets 真的很有帮助,帮助我解决了这个问题。我开始查看丢失的“”,但注意到当我输入以下代码时:

    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 的值,一切都解决了。 再次感谢 cmets 的帮助。

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

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

    现在一切正常,应用在 Swift 3 下再次运行。

    【讨论】:

      【解决方案3】:

      您的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 响应。

      【讨论】:

      • 我认为这不是问题,因为如果是这种情况,他应该在 Swift 2 中崩溃(?)不确定你是否也可能是正确的。
      • 谢谢,试过了,但没有帮助。尽管如此,作为成功的致命错误仍然为零。输出没有“”,所以我认为它是正确的键值格式。
      • 是的并且仍在阅读它,但到目前为止并没有孤立我的问题,但我仍在阅读它。
      • 在阅读了您重复的帖子线程后,我刚刚得出了相同的结论,即答案缺少“”。我将与服务器小伙交谈并更新我的答案。感谢您查看可能的问题。
      • @Sneak 打印命令类似于 NSLog 命令,它会从字典中的纯字母数字键或值中去除引号。
      猜你喜欢
      • 2013-05-22
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多