在 Swift 3 中将 JSON 字符串转换为字典

Posted

技术标签:

【中文标题】在 Swift 3 中将 JSON 字符串转换为字典【英文标题】:Convert a JSON string to Dictionary in Swift 3 【发布时间】:2017-06-04 15:08:48 【问题描述】:

作为一个编码练习,我编写了一个小程序来将 mysql 数据从网络传输到 iPhone。在服务器端。我写了php脚本来获取脚本返回json数据。

在 xcode 上我有

[code]
.
.
.
     let jsonString = try? JSONSerialization.jsonObject(with: data!, options:    [])
    print(jsonString!)
    .
    .
    .
[/code]

在 xcode 控制台中,我有这个:

[code]
(
        
        Address = "1 Infinite Loop Cupertino, CA";
        Latitude = "37.331741";
        Longitude = "-122";
        Name = Apple;
    
)
[/code]

I have a function
    [code]

func convertToDictionary(text: String) -> [String: Any]? 
            if let data = text.data(using: .utf8) 
                do 
                    return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
                 catch 
                    print(error.localizedDescription)
                
            
            return nil
        
[/code]

当我将 jsonString 传递给 convertToDictionary(text:)

[code]
let dict = convertToDictionary(text: jsonString as! String)
[/code]

在控制台中,我收到一条错误消息“无法将 '__NSSingleObjectArrayI' (0x10369bdb0) 类型的值转换为 'NSString' (0x1004eac60)。”

但如果我对 json 字符串进行硬编码,然后将其传递给 convertToDictionary(text:)

[code] 
let hardCodedStr = "\"Address\":\"1 Infinite Loop Cupertino, CA\",\"Latitude\":\"37.331741\",\"Longitude\":\"-122\",\"Name\":\"Apple\""

let dict = convertToDictionary(text: hardCodedStr)
print(dict!)
[/code] 

它工作得很好。这是为什么?谢谢

【问题讨论】:

这不是你应该使用的this。此函数只是将 JSON 字符串转换为字典的便捷方式如果您只有字符串可以使用。但这不是你的情况:你有 JSON data。您应该将 data 转换为字典 - 完全忘记字符串。 变量jsonString已经是一个从JSON字符串转换而来的字典。 【参考方案1】:

如果您仔细查看 jsonObject(with:options:) 返回的内容,您会发现它是 [String: Any][Any],具体取决于您的 JSON。

因此,jsonString这里实际上存储了一个[String: Any],即使编译器认为它是Any类型:

let jsonString = try? JSONSerialization.jsonObject(with: data!, options:    [])
print(jsonString!)

如果您尝试将其传递给接受StringconvertToDictionary,它当然不起作用,因为字典和String 不是兼容的类型。

如何解决这个问题?

问题已经解决了!你根本不需要convertToDictionaryjsonString 本身你想要的字典。

这是你需要做的:

let jsonString = try? JSONSerialization.jsonObject(with: data!, options: []) as! [String: Any]
                                                                             ^^^^^^^^^^^^^^^^^
                                                                             Add this part

之后,您可以在jsonString 上调用字典方法。我还建议您将jsonString 重命名为其他名称。

【讨论】:

感谢您的回复。 jsonString 已经是字典了?我就是这么糊涂的。我认为字典的格式类似于 ["Address":"xyz", "Name":"Apple"...] (带方括号。)这看起来确实像,这就是为什么我认为它是 Json 字符串.所以我可以用字典方法访问它? 是的,你可以。您只需先将其转换为[String, Any]。 @托尼 @Tony 请参阅编辑以了解如何执行此操作!如果您认为我的回答回答了您的问题,请考虑点击复选标记接受它! 它给出错误“无法使用类型参数列表调用 jsonObject (with:String,options:[Any])” @Mansuu.... 尝试先从 JSON 中提取字符串。我建议您使用 SwiftyJSON 来执行此操作。然后,您可以使用 SwiftyJSON 的一项功能将字符串转换为字典。

以上是关于在 Swift 3 中将 JSON 字符串转换为字典的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 JSON 转换为数据类型?

如何在 swift 3 中将具有自定义类的数组转换为 JSON

在 Swift 中将字典转换为 JSON

在 Swift 中将字典转换为 JSON

在 Swift 3 中将 JSON 对象解析为 NSArray

如何在 Swift 3 中将 NSData 转换为数据?