如何在Objective C中解析JSON格式

时间:2011-10-03 17:42:40

标签: iphone objective-c ios json

嘿,我正在编写一个iphone应用程序以将谷歌搜索结果添加到我的应用程序中,我已经使用JSON类来获得结果...当我在JSON Parser中解析它并将其存储在NSDictionary中时我得到了3把钥匙:

  1. responseData
  2. responseDetails
  3. responseStatus
  4. 重要的一个是第一个具有搜索结果的responseData ...

    问题是(我认为)在responseData中的另一个键是“results”,其中包含url和其他东西,这是我的应用程序最重要的部分...如何访问这个并将其放入NSDictionary .....

    这是请求:

    http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton
    

    为了明确说明,请考虑将该请求放入浏览器中,当您获得结果时,将其复制并放入左侧的此网站,以查看密钥和其他内容:

    http://json.parser.online.fr/
    

    日Thnx

3 个答案:

答案 0 :(得分:4)

您可以使用JSON parser - SB Json将json字符串转换为ObjectiveC对象。请注意,ObjectiveC中有许多JSON解析器,但我选择了SB Json,因为它易于使用。但根据一些基准测试,JSONKit比SBJson更快。

一旦你有了你的json字符串就像这样 -

#import "JSON.h"

// Create SBJSON object to parse JSON
SBJSON *parser = [[SBJSON alloc] init];

// parse the JSON string into an object - assuming json_string is a NSString of JSON data
NSDictionary *object = [parser objectWithString:json_string error:nil];
NSLog(@"JSON data: %@", object);

如果您需要将公共时间轴从Twitter解析为JSON,您将采取以下措施。同样的逻辑可以应用于您的Google搜索结果。你需要仔细检查你所有的json结构......

// Create new SBJSON parser object
SBJSON *parser = [[SBJSON alloc] init];

// Prepare URL request to download statuses from Twitter
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://twitter.com/statuses/public_timeline.json"]];

// Perform request and get JSON back as a NSData object
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// Get JSON as a NSString from NSData response
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

// parse the JSON response into an object
// Here we're using NSArray since we're parsing an array of JSON status objects
NSArray *statuses = [parser objectWithString:json_string error:nil];

// Each element in statuses is a single status
// represented as a NSDictionary
for (NSDictionary *status in statuses)
{
  // You can retrieve individual values using objectForKey on the status NSDictionary
  // This will print the tweet and username to the console
  NSLog(@"%@ - %@", [status objectForKey:@"text"], [[status objectForKey:@"user"] objectForKey:@"screen_name"]);
}

答案 1 :(得分:1)

Il me semble que voussavezdéjàcommentanalyzer JSON en forme NSDictionary,alors voici quelques suggestions surlafaçondede forer vers bas pourvosrésultatsdétaillésencascade。 En anglais pour tout le monde。

responseData本身是一个NSDictionary,结果是其中的一个对象。结果恰好是您提供的案例的数组。

将JSON转换为NSDictionary表单后,您将以递归方式转换内部的所有对象。

你可以尝试这样的东西来获得你想要的东西:

让我们假设完全转换的JSON位于NSDictionary中,名为响应

NSDictionary *responseDate = [response objectForKey:@"responseData"];
NSArray *resultsArray = [responseData objectForKey:@"results"];

现在您可以使用迭代器或for循环来遍历每个结果。

需要注意的一点是,如果只有一个结果,则应首先测试该对象的类是否为NSArray。此外,如果没有结果,您也应该对此进行测试。

所以你可能想用这种方式编码来处理这些情况:

NSDictionary *responseDate = [response objectForKey:@"responseData"];
If ([[responseData objectForKey:@"results"] isKindOfClass [NSArray class]]) {
    NSArray *resultsArray = [responseData objectForKey:@"results"];
    ... do other things to get to each result in the array ...
}
else if ([[responseData objectForKey:@"results"] isKindOfClass [NSDictionary class]]) {
    // it looks like each individual result in returned in a NSDictionary in your example
    ... do the things to handle the single result ...
}
else {
    // handle no results returned
}

答案 2 :(得分:0)

如果您不确切知道发生了什么,那么您应该做的第一件事就是NSLog JSON解析器输出的description。这将是NSDictionary和NSArray的“嵌套”,当您看到description输出时,您将理解JSON“对象”与NSDictionary和JSON“数组”的一对一映射到NSArray 。因此,您“理解”解析器输出的方式与“理解”JSON源的方式相同。

在你的情况下,你可能会提取“responseData”对象,将其转换为NSDictionary,从中提取“结果”,将其(在此猜测)转换为NSArray,然后遍历该数组以提取单个结果