#ios #swift
#iOS #swift
Вопрос:
Как преобразовать это. «{n ID = «d9a7c7bf-781d-47b3-bb4e-e1022ec4ce1b»;n Name = Штаб-квартира; n}»; В этот формат { «ID»: «d9a7c7bf-781d-47b3-bb4e-e1022ec4ce1b», «Name»: «Штаб-квартира» }
if let jsonString = text as? String {
let objectData = jsonString.data(using: String.Encoding.utf8)
do {
let json = try JSONSerialization.jsonObject(with: objectData!, options: .allowFragments) as! [String:Any] //try JSONSerialization.jsonObject(with: objectData!, options: JSONSerialization.ReadingOptions.mutableContainers)
print(String(describing: json))
return json
} catch {
// Handle error
print(error)
}
}
Цитата из блока
Комментарии:
1. Как вы это получили
String
(text
)? Похоже, это описаниеNSDictionary
, а не словарь JSON.2. Это неверный json. исправьте структуру json из серверной части
3. у вас неправильная строка json, и вы хотите создать правильную строку json? Это не проблема JSONSerialization. Вы должны получить правильную строку json, подобную этой:
"{"ID": "d9a7c7bf-781d-47b3-bb4e-e1022ec4ce1b","Name": "Headquarters"}"
4. Используйте сайты форматирования json для проверки ваших строк json: jsonformatter.curiousconcept.com
5. Что вы используете для получения этого json в первую очередь, может быть, вы можете предоставить код для вашего вызова API?
Ответ №1:
Прежде всего, и уже упоминалось, что формат строки явно не является JSON.
Это строковый формат, который возвращается при вызове description
свойства типа Foundation collection ( NSArray
/ NSDictionary
).
Например, вызывается print
оператор description
, и этот формат также отображается в выводе Terminal.app.
Однако есть решение: этот формат строки называется openStep
( OpenStep / NeXt
устаревший формат) и доступен в PropertyListSerialization
Этот код считывает формат:
let string = "{n ID = "d9a7c7bf-781d-47b3-bb4e-e1022ec4ce1b";n Name = Headquarters;n}"
let data = Data(string.utf8)
do {
let dictionary = try PropertyListSerialization.propertyList(from: data, format: nil)
print(dictionary)
} catch { print(error) }
Примечание:
Я почти уверен, что исходный формат данных не OpenStep и где-то вы без необходимости создали строку с String(describing
инициализатором, как в вопросе.
Комментарии:
1. @vadian: Хотя приятно узнать, что PropertyListSerialization может вернуть это (определенно нужно иметь это в виду), может быть, было бы интереснее узнать, почему у пользователя в первую очередь есть описание
NSDictionary
? Я думаю, что с его / ее стороны есть код для очистки и некоторое недопонимание.2. @Larme Я добавил примечание.
3. @vadian: я столкнулся с еще одной проблемой, подобной этой: «(n {n Caption = «<null>»;n ID = 0; n IMGURL = » chiefpoint.blob.core.windows.net/publiccommoncdn /… «;n } n)»; не преобразуется в NSArray ??. могу ли я решить эту проблему, пожалуйста, направьте меня!
4. Я снова подозреваю, что вы делаете что-то не то. Пожалуйста, отредактируйте вопрос и добавьте код, каким образом вы получаете данные и откуда вы получаете эту строку. Маловероятно, что сервер отправляет этот текстовый формат, поскольку формат сильно связан с macOS.
Ответ №2:
ваш формат json неверен. Если вы попробуете это с jsonformatter
, это выдаст эту ошибку:
итак, сначала вам нужно заменить ;
на ,
. Второе заключается в том, что строки должны быть заключены в двойные кавычки, замените Name = Headquarters
на Name = "Headquarters"
.
Это правильная форма
{n ID = "d9a7c7bf-781d-47b3-bb4e-e1022ec4ce1b",
n Name = "Headquarters"n}
Комментарии:
1. Как я могу заменить? Не могли бы вы, пожалуйста, объяснить или дать мне какой-нибудь пример кода для этого
2. я получаю это из базы данных: «{n ID = «d9a7c7bf-781d-47b3-bb4e-e1022ec4ce1b «; n Name = Штаб-квартира; n}»; . Как я могу преобразовать это?
3. затем серверный специалист должен отформатировать json для вас