在Swift中读取JSON数据时获取nil值
在postString常量中,我得到“[{\“Name\”:“ABC\”,“Age\”:35},{\“Name\”:“CDE\”,“Age\”:36}]"在Swift中读取JSON数据时获取nil值,swift,Swift,在postString常量中,我得到“[{\“Name\”:“ABC\”,“Age\”:35},{\“Name\”:“CDE\”,“Age\”:36}]" 当我运行这段代码时,然后调用fatalError()代码。从技术上讲,上面的不是json对象,而是json数组。 尝试强制转换为[AnyObject]而不是[String:AnyObject] 然后使用数组访问所需的项目。然后将其强制转换为 [字符串:AnyObject] 因为它们是json数组中的json对象其他一些人已经解释了您在本例
当我运行这段代码时,然后调用fatalError()代码。从技术上讲,上面的不是json对象,而是json数组。 尝试强制转换为
[AnyObject]
而不是[String:AnyObject]
然后使用数组访问所需的项目。然后将其强制转换为
[字符串:AnyObject]
因为它们是json数组中的json对象其他一些人已经解释了您在本例中的错误(当反序列化的输出实际上包含数组时,尝试将其转换为字典) 从细节上退一步,当某些东西失败时,您需要将代码分解成更小的部分,然后跟踪它以查看失败的地方 “as?”强制转换表示“尝试将此对象强制转换为其他类型。将结果包装为可选类型。”如果强制转换失败,则结果为nil。如果成功,则可选类型包含新类型 如果您将代码重写为:
if let postString = NSString(data:data!, encoding: NSUTF8StringEncoding) as? String {
guard let jsonData = postString.dataUsingEncoding(NSASCIIStringEncoding) else {
fatalError()
}
guard let jsonObjects = try? NSJSONSerialization.JSONObjectWithData(jsonData,options: [])
,let JSONArray = jsonObjects as? [[String: AnyObject]]
else {
fatalError()
}
print(JSONArray)
}
然后打印声明就会启动,你就会知道演员是问题所在
编辑:
我刚刚注意到您的JSON数据包含一个类型为[String:Int]
的字典数组。在Swift中,Int
不是对象类型,因此您需要将结果强制转换为[[String:Any]]
,而不是[[String:AnyObject]]
。我已经修复了上面的代码
我在一个操场上编写了以下代码,它可以正常工作:
let jsonObject = try NSJSONSerialization.JSONObjectWithData(data!,
options: NSJSONReadingOptions.AllowFragments)
guard let jsonDict = jsonObject as [String: Any] else {
print("Cast failed")
return
}
它给出了输出:
let jsonString = "[{\"Name\":\"ABC\",\"Age\":35},{\"surveyName\":\"CDE\",\"Age\":36}]"
guard let jsonData = jsonString.data(using: .ascii) else {
fatalError()
}
guard let jsonObjects = try? JSONSerialization.jsonObject(with: jsonData, options: []),
let JSONArray = jsonObjects as? [[String: Any]]
else {
fatalError()
}
print(String(describing: jsonObjects))
这正是我所期望的
编辑#2:
实际上,在进一步的研究中,我很难理解为什么你的代码不起作用。我只是测试了它,而<代码>为[[String:AyObjult] ] /Cuth.Work。结果表明,在SWIFT 3中,如果你将<代码> int <代码> > <代码>任意对象< /代码>,并且你已经包含了基础(或UIKIT)。然后,它被静默地转换为一个
NSNumber
,这是一种对象类型
如果需要调试帮助,您需要显示实际的JSON数据以及将其转换为对象的代码
编辑#3:
以下是我在Swift 2.3中编写和测试的代码:
(
{
Age = 35;
Name = ABC;
},
{
Age = 36;
surveyName = CDE;
}
)
为了提供一个完整的测试,我首先获取一个包含JSON数据的字符串,并将其转换为NSData。然后将该NSData转换回JSON对象,并将其转换为所需的类型,然后运行。上面的代码显示:
func parseJSONTest() {
let jsonString = "[{\"Name\":\"ABC\",\"Age\":35},{\"surveyName\":\"CDE\",\"Age\":36}]"
guard let jsonData = jsonString.dataUsingEncoding(NSASCIIStringEncoding) else {
fatalError()
}
//I'm not sure why you take JSON data, convert it to a string, and convert
//It back to NSData, but to prove a point, this is your code being fed
//well-formed JSON data in an NSData object:
if let postString = NSString(data:jsonData,
encoding: NSASCIIStringEncoding) as? String {
guard let jsonData = postString.dataUsingEncoding(NSASCIIStringEncoding) else {
fatalError()
}
guard let jsonObjects = try? NSJSONSerialization.JSONObjectWithData(jsonData,options: []),
let JSONArray = jsonObjects as? [[String: AnyObject]]
else {
fatalError()
}
print(JSONArray)
}
}
这与您拥有的结构(一个字典数组)相匹配。上面的json数组的键在哪里?应该是
try吗?
而不是try
?@BallpointBen是的,我也尝试过try?但我仍然得到了零值感谢Duncan。我尝试过您的代码,是的,我收到消息“Cast failed”“。现在你能为我提供一个如何读取jsonObject数据的解决方案吗?将强制转换为guard让jsonDict=jsonObject为[[String:AnyObject]]
(你的数据包含一系列字典)。我也尝试过使用你的代码,但仍然收到相同的错误“强制转换失败”。我还附加了视频。请检查。尝试…如图所示。”[[String:Any]]…
。仔细查看您的示例,字典中的值似乎是int,它是标量类型,而不是对象类型。感谢您提供的代码。实际上我正在使用swift 2.3。您能在swift 2.3中提供此代码吗?我正在尝试转换为[AnyObject]但我仍然得到了零值。下面我使用的代码:let jsonObject=try NSJSONSerialization.JSONObjectWithData(data!),options:NSJSONReadingOptions.AllowFragments)as?[AnyObject]print(jsonObject)你能给我提供一个解决方案吗?我说了或多或少相同的事情,但数据实际上是[[String:Int]类型的
并且您不能将其强制转换为[[String:AnyObject]]
,因为int在Swift中不是对象类型。
[["Name": ABC, "Age": 35], ["surveyName": CDE, "Age": 36]]