解析后JSON结果为零

Posted

技术标签:

【中文标题】解析后JSON结果为零【英文标题】:JSON result nil after parsing 【发布时间】: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 没有“”,因此我会在调查后更新问题答案。

【问题讨论】:

JSON Parsing in Swift 3的可能重复 【参考方案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 命令,它会从字典中的纯字母数字键或值中去除引号。

以上是关于解析后JSON结果为零的主要内容,如果未能解决你的问题,请参考以下文章

解析 JSON 文件数据后,在结果 XML 中添加注释

json解析结果部分属性为null的问题

swifty Json 解析数据显示我为零?

vue解析json对象取值异常处理

引入 jackson-dataformat-xml 后,默认响应结果是 json 还是 xml?

引入 jackson-dataformat-xml 后,默认响应结果是 json 还是 xml?