正在解析标签 swift 4 中的 json 数组

parsing json array in label swift 4

这是我的 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()

}

试试这个:

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)

你得到一个错误,因为你的数据包含 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
}