【问题标题】:ios Twitter API JSON parsingios Twitter API JSON解析
【发布时间】:2012-11-09 16:43:27
【问题描述】:

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

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 也解析这个块吗?还是我必须更换图书馆?

谢谢。

【问题讨论】:

  • 你能发布你得到的整个 JSON 块吗?

标签: ios json twitter


【解决方案1】:

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

所以,看起来您正在显示一个典型的、成功解析的 JSON 对象。您可以按如下方式对其进行解密,假设上述输出是通过对一些 NSDictionary 进行 NSLog 生成的,例如 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];

等等

【讨论】:

    【解决方案2】:

    为什么不使用 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);
        }
    
    }];
    

    【讨论】:

    • 这正是我所做的。我使用 NSJSONSerialization 将 JSON 转换为 NSArray(属于 NSDictionary)。我用来表示推文的 Obj C 类(Tweet)是 Jastor 的子类,所以一旦我有了 NSDictionary,我所要做的就是 Tweet *t = [[Tweet alloc] initWithDictionary:dic];获取对象。
    • 我明白了.. 虽然从未使用过自动模型构建器。始终由我自己创建模型逻辑以避免错误和错误,并支持我的对象中的所有 NSCoding 功能。
    猜你喜欢
    • 2013-12-07
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2011-05-23
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多