Как исправить ошибку Domain = NSCocoaErrorDomain Code = 3840 «Недопустимое значение вокруг символа 52».

#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 для вас