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

5
作为一项编程练习,我写了一个小程序,将MySql数据从web传输到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 数据。你应该将 数据 转换为字典 - 完全忘记字符串。 - Eric Aya
变量jsonString已经是从JSON字符串转换而来的字典。 - vadian
1个回答

9

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

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

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

如果您尝试将此内容传递给接受字符串的convertToDictionary,它当然不起作用,因为字典和String是不兼容的类型。
如何解决这个问题?
这个问题已经解决了!您根本不需要convertToDictionaryjsonString 本身就是您想要的字典。
您需要做的是:
```swift if let dictionary = try? JSONSerialization.jsonObject(with: jsonString.data(using: .utf8)!, options: []) as? [String: Any] { //use the dictionary } ```
let jsonString = try? JSONSerialization.jsonObject(with: data!, options: []) as! [String: Any]
                                                                             ^^^^^^^^^^^^^^^^^
                                                                             Add this part

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


感谢回复。jsonString已经是一个字典了吗?这让我很困惑。我以为字典的格式应该是 ["Address": "xyz", "Name":"Apple"...] (带有方括号)。但是它看起来并不像这样,那就是我认为它是一个Json字符串的原因。所以我可以使用字典方法来访问它吗? - Tony
@Tony,请看编辑部分以了解如何完成这个操作!如果你认为我的答案回答了你的问题,请考虑点击勾选标记接受它! - Sweeper
它会报错“无法使用类型(with:String,options:[Any])的参数列表调用jsonObject” - Mansuu....
我的JSON格式有些问题,它包含了一个JSON对象内的字符串,我只想将那个特定的字符串解析成字典。@Sweeper - Mansuu....
1
@Mansuu.... 首先尝试从JSON中提取字符串。我建议您使用SwiftyJSON来完成此操作。然后,您可以使用SwiftyJSON的功能之一将字符串转换为字典。 - Sweeper
显示剩余7条评论

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