Постоянно получаю сообщение об ошибке «Ожидается декодирование массива <Any>, но найден словарь |стриж - PullRequest
0 голосов
/ 11 июля 2019

У меня есть следующий JSON, отформатированный так:

{
    "error":false
}

Я понимаю, что это не массив, потому что он не содержит квадратных скобок с обеих сторон, но я не могу понять, как правильно заставить Swift правильно интерпретировать это.

Это структура, которую я использую:

struct CheckStruct: Decodable {
    let error: String?
}

А вот функция, которая должна читать JSON:

private func JSONFunc() {
    guard let url = URL(string: "https://example.com/example/example.php"),
        let value = name.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)
        else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = "number=\(number)".data(using: .utf8)

    URLSession.shared.dataTask(with: request) { data, _, error in
        guard let data = data else { return }

        do {
            self.CheckRecord = try JSONDecoder().decode(Array<CheckStruct>.self,from:data)
            DispatchQueue.main.async {
                // Do something
            }
        }
        catch {
            print(error)
        }

        }.resume()
}

UPDATE: Если бы я использовал результаты функции для создания оператора if else, как бы это выглядело?

Например, если результаты верны, сделайте это.

иначе сделайте это ...

1 Ответ

2 голосов
/ 11 июля 2019

Ваша модель должна быть такой:

struct CheckStruct: Codable {
    let error: Bool?
}

И ваша функция должна быть такой:

private func JSONFunc() {
    guard let url = URL(string: "https://example.com/example/example.php"),
        let value = name.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)
        else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = "number=\(number)".data(using: .utf8)

    URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data else { return }

        do {
            let myData= try JSONDecoder().decode(CheckStruct.self, from:data)

             print(myData.error)
        } catch {
            print(error)
        }

    }.resume()
}

БОНУС

//Create Typealias

typealias BoolHandler = ((Bool?) -> Void)

//Create Function with Completion

private func fetchData(_ completion: @escaping BoolHandler) {
    guard let url = URL(string: "https://example.com/example/example.php"),
        let value = name.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)
        else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = "number=\(number)".data(using: .utf8)

    URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data else { return }


        do {
            let myData= try JSONDecoder().decode(CheckStruct.self, from:data)

            DispatchQueue.main.async {
              completion(myData.error)
            }
        } catch {
            DispatchQueue.main.async {
              completion(nil)
            }
        }

    }.resume()
}

//Call Method

fetchData { isSuccess in

    if isSuccess {
        // Do something
    } else {
        // Do something
    }
}

Надеюсь, это сработает для вас.

Наслаждайтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...