如何在 Objective C 中解析 JSON 格式
Posted
技术标签:
【中文标题】如何在 Objective C 中解析 JSON 格式【英文标题】:How To Parse JSON Format in Objective C 【发布时间】:2011-10-03 17:42:39 【问题描述】:嘿,我正在编写一个 iphone 应用程序以将谷歌搜索结果放入我的应用程序中,我使用 JSON 类来获取结果......当我在 JSON Parser 中解析它并将其存储在 NSDictionary 中时,我得到了3 键:
-
响应数据
回复详情
响应状态
重要的是第一个responseData,它有搜索结果...
问题是(我认为)responseData 中的另一个键是“结果”,其中包含 url 和其他东西,这是我的应用程序最重要的部分......如何访问这个并将其放入 NSDictionary .....
这是请求:
http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton
为了清楚起见,请考虑将该请求放入您的浏览器中,当您获得结果时将其复制并放入该网站的左侧以查看密钥和其他内容:
http://json.parser.online.fr/
thnx
【问题讨论】:
【参考方案1】:您可以使用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"]);
【讨论】:
【参考方案2】:Il me semble que vous savez déjà comment analyzer JSON en forme NSDictionary, alors voici quelquesSuggestions sur la façon de forer vers le bas pour vos résultats détailés en cascade。 En anglais pour tout le monde.
responseData 本身是一个 NSDictionary 并且 results 是其中的一个对象。结果恰好是您给出的案例的数组。
将 JSON 转换为 NSDictionary 形式后,您将递归地转换其中的所有对象。
您可以尝试这样的方法来获得您正在寻找的东西:
假设完全转换的 JSON 在名为 response
的 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
【讨论】:
【参考方案3】:如果你不明白到底发生了什么,你应该做的第一件事是对 JSON 解析器输出的description
进行 NSLog 记录。这将是 NSDictionary 和 NSArray 的“巢”,当您看到 description
输出时,您将了解 JSON“对象”到 NSDictionary 和 JSON“数组”到 NSArray 的一对一映射。因此,您“理解”解析器输出的方式与“理解”JSON 源的方式相同。
在您的情况下,您可能会提取“responseData”对象,将其转换为 NSDictionary,从中提取“结果”,将其(在这里猜测)转换为 NSArray,然后遍历该数组以提取您的个人结果.
【讨论】:
以上是关于如何在 Objective C 中解析 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章
如何解析 JSON 响应并在 Objective C 中使用它?
如何在 Objective c 中使用 JSON 服务发布数据