Не удается декодировать JSON с одним значением

#swift

#swift

Вопрос:

Я пытаюсь декодировать JSON с помощью одного значения.Это значение не имеет никакого ключа.

 Alamofire
        .request(query, method: method, parameters: parameters)
        .validate()
        .responseJSON { response in
            print(response.request as Any)
        switch response.result {

        case .success(_):
            let data = response.data
            guard let data = data else {
                throw CustomExceptions.invalidJSON("No response found.")
            }
            do {
                let result = try APIHelper.deserialize(type: type, from: data)
                print(result)
            } catch {
                print(error)
            }
        case .failure(let error):
            print(error)
        }
    }
  

Файл JSON содержит только одно значение без какого-либо ключа, т.е. true.
В текущем случае это логическое значение. Результат должен быть true.

Но я получаю эту ошибку.

 dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.})))
  

Комментарии:

1. согласно правилам синтаксического анализа json, json должен начинаться со словаря, поэтому вам нужно поместить это значение в словарь с форматом ключевого значения, иначе оно не будет преобразовано.

2. Если это всего лишь одно значение, почему бы просто не преобразовать / преобразовать его в строку, зачем пытаться декодировать его как json?

3. @JoakimDanielson Я пишу код, в котором много запросов, поэтому, чтобы избежать повторения, я хотел использовать одну функцию для декодирования всех видов ответов. Это работает на таких языках, как Java, где единственное значение, не имеющее ключа, может быть десериализовано напрямую, поэтому я предположил, что в моем коде swift может быть что-то, что я сделал неправильно.

4. Alamofire поддерживает только JSON-ответ. Вам необходимо изменить код во внутренних классах для поддержки прямого типа данных.

Ответ №1:

Вы не можете декодировать одно значение с Decodable помощью протокола, потому что базовый JSONSerialization API вызывается без параметров, поэтому требуется тип коллекции в качестве корневого объекта.

Это именно то, что сообщение об ошибке

Текст JSON не начинался с массива или объекта, и опция, позволяющая не устанавливать фрагменты

говорит, Decodable не позволяет устанавливать какие-либо параметры, такие как allowFragments