парсинг массива json в метку swift 4 - PullRequest
0 голосов
/ 18 марта 2019

Это мой массив 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()

}

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Вы получаете ошибку, потому что ваши данные содержат массив 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
}
0 голосов
/ 18 марта 2019

Попробуйте это:

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)
...