Редактировать: мне удалось определить проблему гораздо более концентрированным полем.Хотя этот пост не обязательно ошибается с его предположениями, Swift 4 base64 String to Data не работает из-за специального символа , гораздо более понятен и имеет пример Playground.
У меня есть строка, которую нужно сериализовать в словарь в Swift 4. Приложение позволяет пользователям загружать данные (JSON сериализуется как данные) и загружать их позже.Что касается последнего, приложение выполняет следующие действия с загруженными данными (dlData)
if let rootDict = NSKeyedUnarchiver.unarchiveObject(with: dlData) as? Dictionary<String, Any> {
if let content = rootDict["C"] as? String {
if let data = content.data(using: .utf8, allowLossyConversion: true){
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any]
...
} else {
print("DATA DIDNT WORK") //gets printed with his data
}
Практически каждый раз, когда это работает нормально, но недавно пользователь связался со мной, что на его iPhone нет никаких данныхпоявление.Я добавил else
путь, и вот куда он идет.Кажется, что он не может преобразовать эту конкретную строку в данные
Когда я print()
строки, скопировать вывод консоли и затем жестко закодировать его в метод, он работает просто отлично.Строка является допустимой JSON (проверяется с помощью 3 различных онлайн-валидаторов), и JSONSerialization также работает. Но не в «живой» среде, где используются загруженные данные вместо жестко закодированного print()
-representation
Я думаю, что проблема может заключаться в том, что консоль XCode «очищает» строку и «плохие» символы, которые могут быть в ней, поэтому копирование позволяет работать, а прямая загрузка - нет.Единственная странная вещь, которую я могу заметить в строке print()
ed - это символ замены (символ)).
dlData > rootDict > content > data > json
Data > Dictionary > string > Data > Dictionary
Не самая лучшая последовательность для этой задачи, ноЯ не в состоянии изменить инфраструктуру этой системы.И поскольку он работает как минимум для 95% пользователей, я думаю, что он должен работать для всех них.
Я пытался сделать replacingOccurrences(of: "�", with: "?")
, но это не влияет на строку, возможно потому, что в реальной строке это не «�», а что-то другое, и «�» отображается только потому, что консоль неНе знаю, как еще это выразить.
Я сталкивался с этим блогом https://natrajbontha.wordpress.com/2017/10/12/replacement-character-in-json-data/, но я бы предпочел проводить очистку только тогда, когда преобразование уже не удалось один раз.
Первоначальный персонаж в этом месте - смайлик с американским флагом, и мои пользователи могут жить без последних смайликов, но в целом я хочу, чтобы смайлики отображались, поэтому их замена не является выбором.
Я только что попробовал то же самое на игровой площадке, и это привело к тому же.
//b64String is dlData but in base64
let decodedData = Data(base64Encoded: b64String)! //works
if let unarchivedDictionary = NSKeyedUnarchiver.unarchiveObject(with: decodedData) as? Dictionary<String, Any> { //works
if let dF = unarchivedDictionary["C"] as? String { //works
print(dF) //prints
if let data = dF.data(using: .utf8, allowLossyConversion: true) { //fails
print(data)
} else {
print("NO DATA") //prints
}
}
}