在Swift中读取JSON数据时获取nil值

在Swift中读取JSON数据时获取nil值,swift,Swift,在postString常量中,我得到“[{\“Name\”:“ABC\”,“Age\”:35},{\“Name\”:“CDE\”,“Age\”:36‌​}]" 当我运行这段代码时,然后调用fatalError()代码。从技术上讲,上面的不是json对象,而是json数组。 尝试强制转换为[AnyObject]而不是[String:AnyObject] 然后使用数组访问所需的项目。然后将其强制转换为 [字符串:AnyObject] 因为它们是json数组中的json对象其他一些人已经解释了您在本例

在postString常量中,我得到“[{\“Name\”:“ABC\”,“Age\”:35},{\“Name\”:“CDE\”,“Age\”:36‌​}]"
当我运行这段代码时,然后调用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]]