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