3

我正在尝试解析 Twitter API 接收到的 JSON 字符串以获取用户时间线。我正在使用 Jastor 将 JSON 响应转换为目标 c 对象。一切正常,直到我尝试解析实体对象

entities = {
        hashtags =();
        media = (
                 {
                "display_url" = "pic.twitter.com/...";
                "expanded_url" = "http://...";
                id = ...;
                "id_str" = ...;
                indices =(
                    5,
                    25
                );
                "media_url" = "http://...";
                "media_url_https" = "https://...";
                sizes ={
                    large ={
                        h = 765;
                        resize = fit;
                        w = 1024;
                    };
                    medium ={
                        h = 448;
                        resize = fit;
                        w = 600;
                    };
                    small ={
                        h = 254;
                        resize = fit;
                        w = 340;
                    };
                    thumb ={
                        h = 150;
                        resize = crop;
                        w = 150;
                    };
                };
                type = photo;
                url = "http://...";
            }
        );
        urls =();
        "user_mentions" = ();
    };

即使 JSON 不是标准的,Jastor 似乎也解析了所有内容,但由于“(”“)”的存在,这个块。你知道如何让 Jastor 也解析这个块吗?还是我必须改变图书馆?

谢谢你。

4

2 回答 2

8

您的问题输出令人好奇的是它不是 JSON 格式的字符串。它看起来像NSDictionaryNSArray对象的嵌套组合,这在将 JSON 字符串转换为 Objective-C 对象时很常见。当您使用NSLog这种对象时,大括号表示NSDictionary对象,括号表示NSArray对象。

因此,看起来您正在显示一个典型的、成功解析的 JSON 对象。您可以按如下方式对其进行解密,假设上述输出是通过执行NSLog一些NSDictionary调用生成的,例如jsonObject

NSDictionary *entity  = [jsonObject objectForKey:@"entities"];
NSArray *media        = [entity objectForKey:@"media"];
NSDictionary *media0  = [media objectAtIndex:0];
NSString *display_url = [media0 objectForKey:@"display_url"];
NSArray *sizes        = [media0 objectForKey:@"sizes"];
NSDictionary *size0   = [sizes objectAtIndex:0];

或者,如果使用现代 Objective C,只需:

NSDictionary *entity  = jsonObject[@"entities"];
NSArray *media        = entity[@"media"];
NSDictionary *media0  = media[0];
NSString *display_url = media0[@"display_url"];
NSArray *sizes        = media0[@"sizes"];
NSDictionary *size0   = sizes[0];

等等

于 2012-11-21T13:12:45.257 回答
1

为什么不使用 iOS 5.0 NSJSONSerialization 中的新功能,它将 JSON 数据转换为 NSArray 或 NSDictionary 等 Objective C 标准。

NSString *stringURL = [NSString stringWithFormat:@"%@?%@", kTwitterApi, kParams];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:stringURL]];
request.HTTPMethod = @"GET";

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

    if (error) {
        NSLog(@"Error%@", error.localizedDescription);
    }else {
        NSError *err;
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&err];

        NSLog(@"%@", json);
    }

}];
于 2012-11-21T12:43:50.583 回答