在Objective-C中解析JSON最漂亮的方法?

时间:2013-12-07 14:20:34

标签: ios objective-c json macos

我正在尝试从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数据的值?

2 个答案:

答案 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:。该课程将阅读所有valuecurrency属性。

然后创建一个类MyData,其initWithDictionary:将读取last_allbuy个属性,并将解析委托给-[MyPrice initWithDictionary]

在类上定义readonly属性。

然后使用属性访问数据,例如data.lastPrice.value

这是更多的工作,但它会让你的代码更漂亮,因为它可以处理对象,而不是字典。