如何从swift中的jsonObject中删除“(”)?

时间:2016-05-22 05:56:10

标签: swift nsdictionary nsjsonserialization

有一个字典,通过以下代码格式化为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并将其拆分的唯一方法吗?我希望有更好的方法可能

1 个答案:

答案 0 :(得分:2)

不要使用字符串操作来删除括号!首先获得正确的字符串。

问题是JSON中的results包含多个结果的数组:

"results": [ ... ]

valueForKeyPath遇到数组时,它会将其余的键路径(在您的情况下为definition)应用于数组中的每个项,并返回另一个包含所有结果的数组

当您将数组转换为字符串时,您会在数组中的项目周围获得( )。 (引用字符串和每个项目之间的逗号。你可能也不想要那些。)

因此,如果您的JSON有多个结果,请执行以下操作:

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

标签中的文字为:

(
    "first definition",
    "second definition"
)

要解决此问题,请仅提取您实际需要的results数组中的单个项目。不幸的是,您无法使用valueForKeyPath执行此操作(请参阅this answer)。无论如何,最好在每个级别检查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
}