【问题标题】:parsing json array in label swift 4在标签swift 4中解析json数组
【发布时间】:2019-03-18 11:01:38
【问题描述】:

这是我的 JSON 数组

[  
   {  
      "dollar":"15000",
      "date":"1397-12-12"
   }
]

我想在两个不同的标签中显示美元和日期值,但我遇到了这种类型不匹配错误:

typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))

这是我的结构:

    struct Dollar_Date : Codable {
    let dollar : String
    let date : String
}

这是我在视图控制器中的代码:

func dollarLabel() {

let urlString = DOLLAR_DATE_BASE_URL
guard let url = URL(string: urlString) else { return }

// 2
URLSession.shared.dataTask(with: url) { (data, response, error) in
    if error != nil {
        print(error!.localizedDescription)
    }

    guard let data = data else { return }
    do {
        // 3
        //Decode data
        let JSONData = try JSONDecoder().decode(Dollar_Date.self, from: data)

        // 4
        print(JSONData.dollar)
        //Get back to the main queue
        DispatchQueue.main.async {
            self.main_Price.text = JSONData.dollar
            self.data_Label.text = JSONData.date
        }

    } catch let jsonError {
        print(jsonError)
    }
    // 5
    }.resume()

}

【问题讨论】:

    标签: json parsing uilabel swift4.2


    【解决方案1】:

    试试这个:

    guard let jsonArray = JSONData as? [[String: Any]] else {
          return 
    }
    print(jsonArray)
    //Now get title value 
    guard let title = jsonArray[0]["title"] as? String else { return } print(title)
    

    【讨论】:

      【解决方案2】:

      您收到错误是因为您的数据包含 JSON 数组(也包含字典),而不是 JSON 本身。

      所以你不能用解码

       let JSONData = try JSONDecoder().decode(Dollar_Date.self, from: data)
      

      但你必须手动完成:

      编辑:

      guard let json = data as? [[String:Any]] else{return}
      

      现在您可以从数组的所有元素中检索美元和日期:

       // These are because you have to access an element of the array
       guard let dollar = json[0]["dollar"] as? String else {return}
       guard let date = json[0]["date"] as? String else {return}
      
       DispatchQueue.main.async {
              self.main_Price.text = dollar
              self.data_Label.text = date
          }
      

      如果您的数据可以包含多个值(美元-日期对),您必须循环您的数组。按照前面的例子,你应该这样做:

      for element in json{
          guard let dollar = element["dollar"] as? String else {return}
          guard let date = element["date"] as? String else {return}
      
          // do some stuff with each value
      }
      

      【讨论】:

      • tnx 我有这个警报:从'Dollar_Date'转换为不相关类型'[[String:Any]]'总是在这一行失败:guard let json = JSONData as? [[String:Any]] else{return} 和类型不匹配还存在
      • 对不起,我误解了变量。检查编辑,您必须使用数据而不是 JSONData
      猜你喜欢
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      相关资源
      最近更新 更多