我正在尝试从API解析一些JSON,但是我在解析JSON的子元素时遇到了“麻烦”。我这样做的方法似乎更漂亮。
我正在尝试从http://data.mtgox.com/api/2/BTCUSD/money/ticker_fast?pretty
解析而我得到了
{
"result": "success",
"data": {
"last_local": {
"value": "785.00000",
"value_int": "78500000",
"display": "$785.00",
"display_short": "$785.00",
"currency": "USD"
},
"last": {
"value": "785.00000",
"value_int": "78500000",
"display": "$785.00",
"display_short": "$785.00",
"currency": "USD"
},
"last_orig": {
"value": "785.00000",
"value_int": "78500000",
"display": "$785.00",
"display_short": "$785.00",
"currency": "USD"
},
"last_all": {
"value": "785.00000",
"value_int": "78500000",
"display": "$785.00",
"display_short": "$785.00",
"currency": "USD"
},
"buy": {
"value": "785.00000",
"value_int": "78500000",
"display": "$785.00",
"display_short": "$785.00",
"currency": "USD"
},
"sell": {
"value": "785.50000",
"value_int": "78550000",
"display": "$785.50",
"display_short": "$785.50",
"currency": "USD"
},
"now": "1386421846023718"
}
}
现在,我想在value
last
处访问data
。我这样做的方法是嵌套一堆objectForKey:string - 比如
[[[[[self getInformationFrom:mtgox] objectForKey:@"data"] objectForKey:@"last"] objectForKey:@"value"] floatValue];
基本上getInformationFrom:mtgox
所做的是返回带有NSJSONSerialization的NSDictionary。
有没有更好的方法来获取此JSON数据的值?
答案 0 :(得分:6)
您可以使用dictionary literals:
[[self getInformationFrom:mtgox][@"data"][@"last"][@"value"] floatValue];
或者您可以使用KVC:
[[[self getInformationFrom:mtgox] valueForKeyPath:@"data.last.value"] floatValue];
答案 1 :(得分:2)
JSON是一种通信协议。你能做的最好的事情就是先把它解析成对象。
例如,使用方法MyPrice
创建一个类initWithDictionary:
。该课程将阅读所有value
,currency
属性。
然后创建一个类MyData
,其initWithDictionary:
将读取last_all
,buy
个属性,并将解析委托给-[MyPrice initWithDictionary]
。
在类上定义readonly
属性。
然后使用属性访问数据,例如data.lastPrice.value
。
这是更多的工作,但它会让你的代码更漂亮,因为它可以处理对象,而不是字典。