【问题标题】:How do I save JSON array of dictionaries in Swift that maps a String to an Int or String?如何在 Swift 中保存将 String 映射到 Int 或 String 的 JSON 字典数组?
【发布时间】:2014-07-03 21:28:42
【问题描述】:

我在这方面遇到了很多困难。

我的服务器发送字典的 JSON 数组,字典以 String 作为键,以 String 或 Int 作为键的值。例如,如果键是名称,它会返回一个字符串,但有些值会要求返回 Ints 的“time since”之类的数字。

如何在 Swift 中处理这个问题?

我的第一次尝试是:

let dictArray = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &jsonError) as Dictionary<String, Any>[]

但我明白了:

致命错误:无法打开 Optional.none

如果我将 Any 更改为 AnyObject 我不能将它转换为 Int 用于某些键,它会抱怨下标。

我该怎么办?

【问题讨论】:

    标签: json swift


    【解决方案1】:

    Cocoa 到 Swift 的绑定将 id 映射为 AnyObject。而且由于不保证键值存在于字典中,所以下标返回AnyObject?

    在这些方面,Xcode beta2 似乎仍然存在问题。 例如,这会导致 swift REPL 重复崩溃:

    let a : AnyObject? = nil
    let b : Any? = a
    

    所以这也可能是为什么转换为 Dictionary&lt;String, Any&gt;[] 不起作用的原因。

    无论哪种方式,您最好使用 "literal" 映射 Dictionary&lt;String, AnyObject&gt;[] 并自己检查类型。 将AnyObject? 转换为Int 时,您必须记住您是actually dealing with an optional。这意味着您必须先使用 !if let 构造来解开它。

    或者,您可以只遍历字典:

    var jsonError : NSError?
    if var dictArray = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &jsonError) as? Dictionary<String, AnyObject>[]
    {
        for dict in dictArray
        {
            for (key, data) in dict
            {
                var output : String = "(unknown)";
                if let number = data as? Int
                {
                    output = "\(number)"
                }
                else if let str = data as? String
                {
                    output = str
                }
                println("\(key): \(output)")
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 2019-01-31
      相关资源
      最近更新 更多