Как быстро удалить (из jsonObject?)

Существует словарь, который отформатирован как JSONObject следующим кодом:

json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) 
as! NSDictionary

Данные

{
"word": "detrimental",
"results": [
{
    "definition": "(sometimes followed by `to') causing harm or injury",
    "partOfSpeech": "adjective",
    "synonyms": [
        "damaging",
        "prejudicial",
        "prejudicious"
    ],
    "similarTo": [
        "harmful"
    ],
    "derivation": [
        "detriment"
    ]
}
],
"syllables": {
"count": 4,
"list": [
    "det",
    "ri",
    "men",
    "tal"
]
},
"pronunciation": {
"all": ",dɛtrə'mɛntəl"
},
"frequency": 2.77
}

Пытаюсь вывести данные с меткой

label.text = "\(json.valueForKeyPath("results.definition")!)"

Но результат выглядит так:

(
    "(sometimes followed by `to') causing harm or injury"
)

Мой вопрос: как лучше всего сделать так, чтобы вывод отображал только текст без "()"?

Это единственный способ преобразовать данные json в NSString и разделить их? Я надеюсь, что есть способ получше, если возможно


person Joey Zhang    schedule 22.05.2016    source источник
comment
Возможный дубликат Удалить символы из NSString?   -  person ozgur    schedule 22.05.2016


Ответы (1)


Не используйте строковые манипуляции для удаления скобок! Получите в первую очередь правильную строку.

Проблема в том, что results в вашем JSON содержит массив из нескольких результатов:

"results": [ ... ]

Когда valueForKeyPath встречает массив, он применяет оставшуюся часть ключевого пути (в вашем случае definition) к каждому элементу в массиве и возвращает другой массив со всеми Результаты.

Когда вы конвертируете массив в строку, вы получаете ( ) вокруг элементов в массиве. (И кавычки вокруг строк и запятые между каждым элементом. Вероятно, они вам тоже не нужны.)

Итак, если ваш JSON имеет более одного результата, например:

"results": [
            {
            "definition": "first definition",
            },
            {
            "definition": "second definition",
            }
            ],

текст на вашей этикетке будет:

(
    "first definition",
    "second definition"
)

Чтобы исправить это, извлеките только тот единственный элемент в массиве results, который вам действительно нужен. К сожалению, вы не можете сделать это с valueForKeyPath (см. этот ответ). В любом случае, вам лучше проверять структуру вашего JSON на каждом уровне, чем предполагать, что вам были переданы данные в точном формате, который вы ожидаете.

if let json = (try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())) as? NSDictionary,
       results = json["results"] as? NSArray,
       firstResult = results.firstObject as? NSDictionary,
       definition = firstResult["definition"] as? String {
   label.text = definition
}
person Kurt Revis    schedule 22.05.2016