【问题标题】:Parsing NSString as JSON将 NSString 解析为 JSON
【发布时间】:2012-11-19 20:06:37
【问题描述】:

我已经阅读了几个论坛,但似乎无法完成这个简单的任务。我在 Xcode 中有一个指向 PHP 脚本的视图,并将结果存储为下面的 NSString:

[{"id":"16","name":"Bob","age":"37"}]

我无法解析这个 NSString。这就是我获取 NSString 内容的方式:

NSString *strURL = [NSString stringWithFormat:@"http://www.website.com/json.php?
id=%@",userId];

// to execute php code
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];

// to receive the returend value
NSString *strResult = [[NSString alloc] initWithData:dataURL 
encoding:NSUTF8StringEncoding];

如何将结果 (strResult) 转换为 JSON 并从中取出对象?我会假设它如下所示,但我知道我错过了一些东西

NSString *name = [objectForKey:@"name"];
NSString *age = [objectForKey:@"age"];

任何帮助都会很棒。谢谢!

【问题讨论】:

  • 与 xcode ide 无关

标签: php iphone objective-c json parsing


【解决方案1】:

如果您的目标是 iOS 5 及更高版本,只需使用 NSJSONSerialization

http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html

如果您的目标是低于 iOS 5,请使用这样的 JSON 解析器:http://stig.github.com/json-framework/

只需在您的 JSON 字符串上调用 JSONValue(或等效)方法:

NSDictionary *dict= [strResult JSONValue];

NSString *name = [dict objectForKey:@"name"];
NSString *age = [dict objectForKey:@"age"];

顺便说一句,您的 JSON 字符串看起来像一个数组,您不能使用 objectForKeyNSArray 获取对象。您有两个选择,将您的 JSON 字符串响应修改为字典或使用 objectAtIndex 获取对象。

【讨论】:

  • NSJSONSerialization 现在 - 如果您需要支持 ios4 及以下版本,则仅回退到此
  • 感谢@Daij-Djan,我将尝试查看 NSJSONSerialization。我正在为 iOS 5 编程,所以应该可以正常工作吗?
【解决方案2】:

使用 NSJSONSerialization 类来读取它

id jsonData = [string dataUsingEncoding:NSUTF8StringEncoding]; //if input is NSString
id readJsonDictOrArrayDependingOnJson = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];

你的情况

NSArray *readJsonArray = [NSJSONSerialization JSONObjectWithData:dataURL options:0 error:nil];
NSDictionary *element1 = readJsonArray[0]; //old style: [readJsonArray objectAtIndex:0]
NSString *name = element1[@"name"]; //old style [element1 objectForKey:@"name"]
NSString *age = element1[@"age"]; //old style [element1 objectForKey:@"age"]

【讨论】:

  • downvoter:叹息......我今天做了什么? :) [发表评论总是一个好主意]
  • 这是解析 JSON 的正确方法,不知道为什么有人 DV'd。
  • @RichardJ.RossIII 感谢理查德,我可能会使用这种方法。不过,我仍在尝试找出放置它的位置...我的 NSString (strResult) 会去哪里?它会取代(jsonString)吗?
  • 是的,就是这样......但是你已经有了数据,所以它的工作量更少。我编辑了我的代码
  • @Daij-Djan 无需来回转换为 NSString 和 NSData。
【解决方案3】:

试试这个....

NSString * strResult = [[NSString alloc] initWithData:responseMutableData encoding:NSUTF8StringEncoding];  
SBJSON *jsonParser = [[SBJSON alloc]init];
if([[jsonParser objectWithString:strResult] isKindOfClass:[NSArray class]])
{
    NSArray *jsonArr=[jsonParser objectWithString: strResult];
    NSDictionary *firstDictonary = [jsonArr objectAtIndex:0];
    NSString *name = [firstDictonary valueForKey:@"name"];
    NSString *age = [firstDictonary valueForKey:@"age"];
}

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多