Я использую ответ API не в формате JSON, но хочу его декодировать, каковы способы достижения этого этапа.
Прямо сейчас ответ не работает. Не удалось декодировать JSON: dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: «Данные данные недействительны в формате JSON.
Я хочу декодировать независимо от того, является ли ответ не json
Я попробовал заменить =(равно) на: и проанализировал JSON, и это сработало, но после внесения нескольких изменений он перестал работать.
Ответ в этом формате
Data = { "value" = "pair"; "value2" = "pair2"; }
Моя попытка
let validJSONString = rawString
.replacingOccurrences(of: " = ", with: ":")
.replacingOccurrences(of: "NA", with: "null")
.replacingOccurrences(of: ";", with: ",")
let validJSONString = rawString .replacingOccurrences(of: " = ", with: ":") .replacingOccurrences(of: "NA", with: "null") .replacingOccurrences(of: ";", with: ",")
В вашем образце и прочитав тест я предполагаю, что необработанное значение равно { "value" = "pair"; "value2" = "pair2"; }
(нет «Данных =»). let output = try PropertyListDecoder().decode([String: String].self, from: Data(rawStr.utf8))
работает, но поскольку NA
кажется возможным значением, я думаю, что этого не должно быть, поэтому вам все равно придется заменить «NA» на «<null>», я думаю, могут потребоваться некоторые проверки. Проблема с заменой ";" с "," заключается в том, что в JSON не должно быть последнего перед закрытием }
.
Имейте в виду, что такого рода манипулирование данными «смешивать до тех пор, пока оно не заработает» является хрупким. Если у вас нет формального определения формата данных, который вы получаете, вы не можете быть уверены, что то, что работает сегодня, продолжит работать, когда данные изменятся и в форматировании данных появится какая-то новая морщина, которую вы не учли.
Один из вариантов — добавить еще одну замену, чтобы избавиться от завершающей запятой.
.replacing(/,\s*}/, with: "}")
Итак, вся конверсия
let validJSONString = rawString
.replacingOccurrences(of: " = ", with: ":")
.replacingOccurrences(of: "NA", with: "null")
.replacingOccurrences(of: ";", with: ",")
.replacing(/,\s*}/, with: "}")
И на самом деле вы можете выполнить это преобразование перед попыткой декодирования, используя DataPreprocessor
, переданный responseDecodable
.
Пожалуйста, добавьте свою попытку решения этой проблемы, даже если она перестала работать.