2017-04-26 63 views
0

我試圖解析從以下json觀察風速值作爲一個浮點數(5.586995)。下面的代碼以數組形式返回值([「5.586995」])。這是Swift 3中最好的方法嗎?任何幫助深表感謝。如何正確解析字典數組

{ 
    "properties":{ 
     "platform_type_description":"Weather and Sea Surface Data", 
     "parameters":[ 
     { 
      "id":"wind_speed", 
      "units":"m s-1", 
      "depth":{ 
       "value":"0", 
       "units":"m" 
      }, 
      "observations":{ 
       "times":[ 
        "2017-04-21T14:08:00" 
       ], 
       "values":[ 
        "5.586995" 
       ], 
       "quality_levels":[ 
        "3" 
       ] 
      } 
     }, 
     { 
      "id":"wind_speed_of_gust", 
      "units":"m s-1", 
      "depth":{ 
       "value":"0", 
       "units":"m" 
      }, 
      "observations":{ 
       "times":[ 
        "2017-04-21T14:08:00" 
       ], 
       "values":[ 
        "7.39788" 
       ], 
       "quality_levels":[ 
        "3" 
       ] 
      } 
     } 
     ] 
    } 
} 

func getWind() {  

    let url = URL(string: "http://windapp.dev/")! 

    URLSession.shared.dataTask(with: url) { (data:Data?, response:URLResponse?, error:Error?) in 

     if error == nil { 
      if data != nil { 
       do { 
        let json = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] 

        guard let properties = json["properties"] as? [String:Any], 
        let parameters = properties["parameters"] as? [Any], 
        let windspeedDict = parameters[0] as? [String:Any], 
        let observationsWindSpeedDict = windspeedDict["observations"] as? [String:[String]] 

         else { 
          print("Error!") 
          return 
         } 

         for (key, value) in observationsWindSpeedDict { 
          if key == "values" { 
           print(value) 
          } 
         } 


         } catch {} 

          } 
        } else { 
         print("Error: Couldn't connect to server") 
         } 
      }.resume() 
    } 
+0

這取決於您的數據模型。你有沒有想過擁有更多或更少的價值? –

+0

顯示你到目前爲止的代碼。如果你有數組將第一個項目轉換爲Double。 – vadian

+0

@PedroCastilho號返回的值將始終爲單個浮點值。 –

回答

0

這是預期的結果,因爲JSON包含浮點值作爲陣列的只有一個元素的值,你創造價值的整個陣列通過你的字典進行遍歷時,

如果你知道你的數據總是看起來像這樣,你應該使你的解析函數更具體,不要將任何值保存爲Any。如果這是來自您自己後端的響應,並且您認爲您的項目會變得相當複雜,那麼您可以使用第三方服務(例如Swagger,雖然它有很多錯誤),使您能夠編寫更抽象的JSON規範並自動生成服務器端和客戶端代碼。不過,我只會將這個推薦給大型複雜的項目。

除此之外,我認爲你的方法是解析這個響應的最佳方法。