iOS解析内部Json

Posted

技术标签:

【中文标题】iOS解析内部Json【英文标题】:iOS Parse Inner Json 【发布时间】:2012-09-07 05:49:29 【问题描述】:

您好,我有以下需要解析的 json,但是,我正在努力解析内部数组。我目前只打印每个内部数组,但我想打印每个标题并将标题添加到数组中。感谢您的帮助!

JSON

"nodes":[
    "node":
        "nid":"1420857",
        "title":"Title 1",
        "votes":"182",
        "popular":"True",
        "teaser":"Teaser 1"
    ,
    "node":
        "nid":"1186152",
        "title":"Title 2",
        "votes":"140",
        "popular":"True",
        "teaser":"Teaser 2"
    ,
    "node":
        "nid":"299856",
        "title":"Title 3",
        "votes":"136",
        "popular":"True",
        "teaser":"Teaser 3"
    
]

Json 解析器

    NSError *error = nil;
    NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.somefilename.json"]];
    if (jsonData) 
        id jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
        if (error) 
            NSLog(@"error is %@", [error localizedDescription]);
            return;
        
        NSArray *keys = [jsonObjects allKeys];
        for (NSString *key in keys) 
            NSLog(@"%@", [jsonObjects objectForKey:key]);
        
     else 
        // Handle Error
    

【问题讨论】:

它工作正常,完全符合预期。有什么问题? 内部数组是什么意思?您发布的内容中只有一个数组,其他所有内容都是字典。你到底要解析什么? 就像我需要打印循环中的每个标题一样,我已经尝试了很多东西,但不知道如何在我正在打印的内容中抓取这些对象。刚刚编辑了我的问题,抱歉我不清楚,但我很想打印循环中的每个标题而不是每个数组 你已经抓住了它们 是 NSDictionary --> NSArray --> NSDictionary --> NSDictionary --> NSString. 【参考方案1】:

只是类型转换它:

NSArray *nodes = (NSArray*)[jsonObjects objectForKey:@"nodes"];
for (NSDictionary *node in nodes)
     // do stuff...

返回id 的方法(如-[objectForKey:]-[objectAtIndex:])可以返回任何objective-c 对象。您需要提前知道将其类型转换为什么以对其执行适当的操作。 JSON 被转换为 NSObject 等价物:

object -> NSDictionary array -> NSArray string -> NSString number -> NSNumber boolean -> NSNumber float -> NSNumber null -> NSNull

要区分各种 NSNumber,您必须调用适当的类型方法:-[intValue]-[boolValue]-[floatValue]。查看NSNumber docs 了解更多信息。

【讨论】:

在 do stuff 评论中我怎么能只记录标题 我试过 NSLog(@"%@",[node objectForKey:@"title"]);然而,这只是给我 null 这是一个嵌套对象,所以你需要做 [(NSDictionary *)[node objectForKey:@"node"] objectForKey:@"title"]; 啊,非常感谢您的帮助,对不起,我对此很陌生:) 对于数字,请查看 [NSNumberFormatter numberFromString:] 如果您不确定数字的格式,它会让您的生活变得轻松,它只是将字符串解析为数字值,您可以稍后决定如何你想用它:int, float【参考方案2】:

你可以使用我的方法进行json解析,

解析方法:

    -(void)jsonDeserialize:(NSString *)key fromDict:(id)content completionHandler:(void (^) (id parsedData, NSDictionary *fromDict))completionHandler
    if (key==nil && content ==nil) 
        completionHandler(nil,nil);
    
    if ([content isKindOfClass:[NSArray class]]) 
        for (NSDictionary *obj in content) 
          [self jsonDeserialize:key fromDict:obj completionHandler:completionHandler];
        
    
    if ([content isKindOfClass:[NSDictionary class]]) 
        id result = [content objectForKey:key];
        if ([result isKindOfClass:[NSNull class]] || result == nil) 
            NSDictionary *temp = (NSDictionary *)content;
            NSArray *keys = [temp allKeys];
            for (NSString *ikey in keys) 
             [self jsonDeserialize:key fromDict:[content objectForKey:ikey] completionHandler:completionHandler];
            
        else
            completionHandler(result,content);
        
    

方法调用:

 NSData *content = [NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"Sample" ofType:@"json"]];
    NSError *error;

//获取序列化的json数据...

   id dictionary = [NSJSONSerialization JSONObjectWithData:content options:NSJSONReadingMutableContainers error:&error];

//获取名为GetInfo

的键的数据
     [self jsonDeserialize:@"GetInfo" fromDict:dictionary completionHandler:^(id parsedData, NSDictionary *fromDict) 
            NSLog(@"%@ - %@",parsedData,fromDict);
        ];

【讨论】:

以上是关于iOS解析内部Json的主要内容,如果未能解决你的问题,请参考以下文章

在 FluentD 中解析内部 JSON

如何解析复杂的 JSON 并在 CollectionView 内部和外部显示它

iOS中JSON解析和XML解析的区别

FastJson将json解析成含有泛型对象,内部泛型对象再次解析出错的解决办法(Android)

在 iOS 中解析 JSON 与解析 XML

iOS开发之网络数据解析--JSON解析简介