当前位置: 首页 > 面试题库 >

使用Swift 3解析JSON

吕自怡
2023-03-14
问题内容

我有要在Swift3中使用的json数据。我正在学习Swift,并正在构建一个非常基本的应用程序,该应用程序显示来自JSON的tableUIView中的项目列表。

{
  "expertPainPanels" : [
     {
       "name": "User A",
       "organization": "Company A"
     },
     {
       "name": "User B",
       "organization": "Company B"
     }
    ]
}

我正在尝试使用Swift 3获取此数据。

if (statusCode == 200) {
    do{
        let json = try? JSONSerialization.jsonObject(with: data!, options:.allowFragments) // [[String:AnyObject]]

/*
    If I do this:

    let json = try? JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String:Any]

    if let experts = json?["expertPainPanels"] as! [String: Any] {
    I get "Initializer for conditional binding must have Optional type, not '[String: Any]'"

*/


        // Type 'Any' has no subscript members.
        if let experts = json["expertPainPanels"] as? [String: AnyObject] {

            for expert in experts {
                let name = expert["name"] as? String
                let organization = expert["organization"] as? String
                let expertPainPanel = ExpertPainPanel(name: name, organization: organization)!
                self.expertPainPanels += [expertPainPanel]
                self.tableView.reloadData()
                self.removeLoadingScreen()
            }
        }
     }catch {
          print("Error with Json: \(error)")
        }
     }

在Swift 2中运行正常。我更新到Swift 3,这破坏了代码。我读了几篇SO,但是我仍然很难理解它。我应用了一些建议,包括Swift 3中的JSON
Parsing,但是我仍然无法解决出现的错误。


问题答案:

从Swift 3开始,您需要尽早进行投射。

这行:

let json = try? JSONSerialization.jsonObject(with: data!, options:.allowFragments)

应该变成这个:

let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as? [String : AnyObject]

这是因为JSONSerialization现在返回Any,它没有为[]运算符实现变体。确保安全地打开演员表,并采取常见措施以确保程序不会崩溃。

编辑:您的代码应该或多或少看起来像这样。

let data = Data()
let json = try JSONSerialization.jsonObject(with: data, options:.allowFragments) as! [String : AnyObject]
if let experts = json["expertPainPanels"] as? [String: AnyObject] {


 类似资料:
  • 我试图获取一个JSON响应,并将结果存储在一个变量中。我在以前的Swift版本中使用过这个代码版本,直到Xcode8的GM版本发布。我在StackOverflow上看了几篇类似的文章:Swift 2 Parsing JSON-Cant下标类型为“anyObject”的值和Swift 3中的JSON Parsing。 然而,这里所传达的思想似乎不适用于这种情况。 如何正确解析Swift3中的JSON

  • 问题内容: 我正在尝试找到一种用C解析JSON的好方法。我真的不需要庞大的库或任何东西,我宁愿拥有体积小,重量轻,功能最少的东西,但有很好的文档。 有人有什么可以指点我的吗? 问题答案: Json并不是一门强大的语言,因此它的库可能很小(至少比Xml库要小)。 有一个整体吨C中的Json.org库链接。也许其中之一会很适合您。

  • 问题内容: 我正在尝试解析来自服务器的输出,如下所示: 我正在尝试使用Java org.json对其进行解析,但是我对JSON / org.json没有任何经验,因此遇到了一些麻烦。我该如何解析? 问题答案: 1)假设您的路径上有JSON库(来自www.json.org),这很简单。 从那里,您可以处理JSON对象的各个部分。看一下Javadocs的细节。 https://developer.an

  • 问题内容: 仅供参考:我是Swift的新手,所以这可能是一个非常简单的问题,但我 无法弄清楚。 我一直在关注 使用Xcode 8 beta和Swift 3 的《开始开发iOS应用程序 (Swift) 教程》。 我将Tap Gesture Recognizer附加到了Image View,然后 在ViewController.swift中添加了此操作: 在图像 视图上轻按以调用selectImage

  • 我正在使用来解析Json数据。我的Json数据如下: GsonParse.java 我使用以下方法来解析此JSON数据。 我面对以下错误。

  • 我正在使用凌空OkHttp从服务器获取一些数据。 响应是一个包含JSON的字符串,我想使用GSON/POJO解析它。 我得到错误: 预期BEGIN_OBJECT,但在第1行第1列路径$上是STRING 尝试解析时。 原因:java.lang.IllegalStateException:预期BEGIN_OBJECT但在第1行第1列路径$ com.google.gson.stream.JsonRead