Swift 4 JSON String с неизвестным символом UTF8 "�" не может быть преобразован в данные / словарь - PullRequest
0 голосов
/ 26 сентября 2018

Редактировать: мне удалось определить проблему гораздо более концентрированным полем.Хотя этот пост не обязательно ошибается с его предположениями, 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...