#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