如何在Swift中解析已解析的JSON中的数组?

28

我正在使用一个返回JSON的API,其格式如下:

{
   "boards":[
      {
         "attribute":"value1"
      },
      {
         "attribute":"value2"
      },
      {
         "attribute":"value3",
      },
      {
         "attribute":"value4",
      },
      {
         "attribute":"value5",
      },
      {
         "attribute":"value6",
      }
   ]
}

在Swift中,我使用两个函数来获取并解析JSON。

func getJSON(urlToRequest: String) -> NSData{
    return NSData(contentsOfURL: NSURL(string: urlToRequest))
}

func parseJSON(inputData: NSData) -> NSDictionary{
    var error: NSError?
    var boardsDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
    return boardsDictionary
}

然后我使用以下方式调用它

var parsedJSON = parseJSON(getJSON("link-to-API"))
JSON解析成功。当我打印输出时,
println(parsedJSON["boards"])

我获得了数组的所有内容。然而,我无法访问每个单独的索引。我确定它是一个数组,因为我这样做时

parsedJSON["boards"].count

返回正确的长度。但是,如果我尝试使用下标来访问单个索引,则会出现问题。

parsedJSON["boards"][0]

XCode关闭了语法高亮并显示以下内容:

XCode Error

代码将无法编译。

这是XCode 6的一个错误,还是我的操作有误?


parsedJSON["boards"][0]肯定是Objective-C的字面量,但它也是Swift语法吗?我不确定(但我猜它是)。 - Nicolas Manzini
5
目前看来与字典数组相关的几个 bug,我也正在苦苦挣扎。 - David Berry
1
如果解析过程中出现错误并返回nil,则您的parseJson函数将崩溃。 "as NSDictionary"是罪魁祸首。有关如何使用NSJSONSerialization解析JSON的正确语法,请参见此处的我的答案:https://dev59.com/v2Af5IYBdhLWcg3w31-O#24333999 - user1687195
Xcode 在奇怪的时候崩溃,很可能不是你的代码导致的。 - μολὼν.λαβέ
4个回答

20

在 Swift 中访问字典会返回一个 Optional 值,所以你需要强制解包(或使用 if let 语法)才能使用它。

以下写法可行: parsedJSON["boards"]![0]

(但这应该不会导致 Xcode 崩溃)


我更倾向于像这样的东西:myDto: MyDTO = getJson()println(myDto.field)println(myDto.anotherField) - Alex

9

6
你可以创建一个变量。
var myBoard: NSArray = parsedJSON["boards"] as! NSArray

然后您可以访问“boards”中的任何内容,例如-

println(myBoard[0])

每当您将解析的数据转换为数组时,都会出现错误。 - Krishna Vedula

4
正确的处理方法是检查字典键的返回值:
    if let element = parsedJSON["boards"] {
        println(element[0])
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接