2017-06-04 45 views
4

中的字典,我編寫了一個小程序將MySql數據從網頁傳輸到iPhone。在服務器端。我編寫了PHP腳本來獲取腳本以返回json數據。作爲一種編碼練習,將JSON字符串轉換爲Swift 3

在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(文字:)

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

在控制檯我得到一個錯誤「無法將'__NSSingleObjectArrayI'(0x10369bdb0)類型的值轉換爲'NSString'(0x1004eac60)」。

但如果我硬編碼的JSON字符串,然後將它傳遞給convertToDictionary(文字:)

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

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

它工作得很好。這是爲什麼?謝謝

+0

這不是你應該如何使用[this](https://stackoverflow.com/a/30480777/2227743)。這個函數只是一個將JSON字符串轉換爲字典的便捷方式,如果只有字符串可以與*一起使用。但這不是你的情況:你有JSON *數據*。您應該將* data *轉換爲字典 - 完全忘記字符串。 – Moritz

+0

變量'jsonString'已經是一個從JSON字符串轉換而來的字典。 – vadian

回答

4

如果仔細觀察jsonObject(with:options:)返回的內容,您將看到它是[String: Any][Any],具體取決於您的JSON。

因此,jsonString這裏居然存儲[String: Any],甚至以爲編譯器認爲它是Any類型:

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

如果您嘗試這個傳遞給convertToDictionary,它接受一個String,它當然不會工作,因爲字典和String是不兼容的類型。

如何解決這個問題?

問題已經解決!根本不需要convertToDictionaryjsonString本身您要的字典。

這就是你需要做什麼:

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

之後,你可以調用jsonString字典方法。我還建議你將jsonString重命名爲別的東西。

+0

感謝您的回覆。 jsonString已經是一個字典?這就是我感到困惑的原因。我認爲一本字典的格式類似於[「Address」:「xyz」,「Name」:「Apple」...](帶方括號)。這聽起來就像是這樣,這就是爲什麼我認爲它是一個Json字符串。所以我可以用字典方法訪問它? – Tony

+0

是的,你可以。你只需要首先將它投射到一個'[String,Any]。 @Tony – Sweeper

+0

@Tony看到編輯如何做到這一點!如果您認爲我的答案回答了您的問題,請考慮點擊對號接受它! – Sweeper