Содержимое ваших данных в виде строки выглядит следующим образом:
"[{\"value\":\"International University \\\"MITSO\\\"\",\"id\":\"a1v24000000uOrPAAU\",\"addlFields\":[\"Mi?narodny Universitet \\\"MITSO\\\"\"]}]"
Просмотр фактического содержимого без дополнительных двойных кавычек и обратной косой черты, необходимых для отображения строки в виде строкового литерала,похоже, что какой-то действительный JSON встроен в строку.
Это может произойти, когда код на стороне сервера дважды кодирует данные.Вам лучше сообщить своему инженеру на стороне сервера, чтобы устранить проблему, но если это сложно или займет много времени, вы можете дважды декодировать его.
Код тестирования:
import Foundation
let dataStr = "<225b7b5c 2276616c 75655c22 3a5c2249 6e746572 6e617469 6f6e616c 20556e69 76657273 69747920 5c5c5c22 4d495453 4f5c5c5c 225c222c 5c226964 5c223a5c 22613176 32343030 30303030 754f7250 4141555c 222c5c22 6164646c 4669656c 64735c22 3a5b5c22 4d693f6e 61726f64 6e792055 6e697665 72736974 6574205c 5c5c224d 4954534f 5c5c5c22 5c225d7d 5d22>".dropFirst().dropLast().replacingOccurrences(of: " ", with: "")
let byteArr = stride(from: 0, to: dataStr.count, by: 2).map{(index: Int)->UInt8 in
let start = dataStr.index(dataStr.startIndex, offsetBy: index)
let end = dataStr.index(start, offsetBy: 2)
return UInt8(dataStr[start..<end], radix: 16)!
}
let responseData = Data(bytes: byteArr)
print(responseData as NSData)
Проверказдесь, является ли вывод оператора print
точно таким же, как ваш пример ответа.(Если вы хотите проверить следующий код с вашими фактическими данными, а не с примером ответа, используйте просто let responseData = result as! Data
вместо строк выше).
Итак, вам просто нужно использовать JSONSerialization
дважды:
block: do {
let firstDecoded = try JSONSerialization.jsonObject(with: responseData, options: .allowFragments) as! String
let firstDecodedData = firstDecoded.data(using: .utf8)!
let secondDecoded = try JSONSerialization.jsonObject(with: firstDecodedData)
//Code below is an example of using decoded result.
guard let resultArray = secondDecoded as? [[String: Any]] else {
print("result is not an Array of Dictionary")
break block
}
print(resultArray)
if
let addlFields = resultArray[0]["addlFields"] as? [String],
let firstAddl = addlFields.first
{
print(firstAddl)
}
} catch {
print(error)
}
Выходы: (пропуская некоторый вывод для print(responseData as NSData)
.)
[["id": a1v24000000uOrPAAU, "value": International University "MITSO", "addlFields": <__NSSingleObjectArrayI 0x100e40c80>(
Mi?narodny Universitet "MITSO"
)
]]
Mi?narodny Universitet "MITSO"
(Вы можете найти некоторые части, такие как <__NSSingleObjectArrayI 0x100e40c80>
, странные, но это просто проблемасоздания описания по умолчанию, и вы можете получить доступ к элементам в виде массива.)
В любом случае, пожалуйста, попробуйте и посмотрите, что вы можете получить с моим кодом выше.