【问题标题】:Parse JSON link in Objective C在 Objective C 中解析 JSON 链接
【发布时间】:2013-05-04 16:47:12
【问题描述】:

我正在为 iPad 创建一个应用程序。谁能给我任何关于如何在Objective C中解析这个JSON链接的建议,这样我就可以从“item_media”获取图像(media_655fa.png)?示例代码:

{
  "id":"6",
  "item_type":"page",
  item_name":"intro_page",
  "item_media":"http:\/\/demo.test.biz\/test\/var\/uploads\/default_item\/media_655fa.png",
  "item_text":""
}

或者,如果有人对如何做到这一点有一些建议。问题在于 PHP 使用json_encode() 发送的链接。如何在目标 C 中做到这一点,例如 PHP 中的 json_decoderegexp

【问题讨论】:

  • 看看 NSJSONSerialization ...
  • 是的。链接是奇怪的两个 \/.. 的问题 :-(
  • 如果您已经使用了 NSJSONSerialization,那么您应该提及并显示您的代码。 - \\/ 在我看来更像是服务器端错误。
  • 感谢编辑们帮我展示代码.. :-)
  • @HAS: NSJSONSerialization 应该已经“unes​​cape”\//。 - 但是有一些混乱,因为这个问题被编辑了好几次:-)

标签: iphone ios objective-c json parsing


【解决方案1】:

您可以将 json 解析为:

// ***************** FETCHING DATA  ******************* //
NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@",SiteAPIURL]];
NSData *data= [NSData dataWithContentsOfURL:URL];
if (data == nil) {
    return;
}
NSError* error;
NSMutableDictionary *jsonIs = [NSJSONSerialization
                          JSONObjectWithData:data
                          options:kNilOptions
                          error:&error];

// NSLog(@"Json : %@",jsonIs);
if (jsonIs != nil) {

        NSString *item_media = [jsonIs objectForKey:@"item_media"];
}

这里item_media 是您的图片链接。

希望对你有帮助。

【讨论】:

  • 也许问题是 PHP 通过 json_encode() 函数发送数据?
  • 是的,这应该在 PHP 结束时修复。
  • 从远程服务器获取数据时不要使用dataWithContentsOfURL:。而是使用 NSURLConnection 并使用 NSURLConnectionDelegate 实现异步模式。您将在 SO 上找到有关如何完成此操作的更多帮助。使用前一种方法,您无法检查错误代码,无法设置 HTTP 标头,无法取消连接等。从服务器获取数据时,您都需要这样做。
【解决方案2】:

试试这个

NSString *jsonString = @"{\"id\":\"6\",\"item_type\":\"page\",\"item_name\":\"intro_page\",\"item_media\":\"http://demo.test.biz/test/var/uploads/default_item/media_655fa.png\",\"item_text\":\"\"}"; // Here jsonString is your Response from server

NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

__autoreleasing NSError *error = nil;
NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];

if(jsonDictionary != nil) {

    NSLog(@"~~~~ item_media: %@", [jsonDictionary objectForKey:@"item_media"]);
}

【讨论】:

  • 请注意,检查成功的正确方法是if (jsonDictionary != nil),而不是if (error == nil)
  • 如果有任何解析错误,error不会为nil。这样我们就可以将错误引用传递给 JSONSerializer
  • 从 NSJSONSerialization.h 阅读这条评论好吗? /* 从 JSON 数据创建一个 Foundation 对象。如果解析器应该允许不是 NSArray 或 NSDictionary 的顶级对象,请设置 NSJSONReadingAllowFragments 选项。设置 NSJSONReadingMutableContainers 选项将使解析器生成可变的 NSArrays 和 NSDictionaries。设置 NSJSONReadingMutableLeaves 选项将使解析器生成可变的 NSString 对象。如果解析过程中出现错误,则设置error参数,结果为nil。*/
  • @AugustinePA:如果没有错误发生,不保证error == nil,因此检查返回值是正确的方法。 - 另见stackoverflow.com/a/9945060/1187415
  • @AugustinePA:Apple 文档正确的。如果发生错误,则将设置 error。但如果没有发生错误,那么error也可以设置为某个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2013-06-06
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多