如何解析收到的响应[关闭]

Posted

技术标签:

【中文标题】如何解析收到的响应[关闭]【英文标题】:How to parse received response [closed] 【发布时间】:2013-11-08 12:22:54 【问题描述】:

我是 ios 应用程序开发的新手,我从服务器收到以下响应:

"[\"EmployeeID\":\"000001\",\"EmplyeeName\":\"ABCD EFGHI\",
\"EmployeeID\":\"000002\",\"EmplyeeName\":\"ADGHT ASASASAS\"]"

请任何人帮助我了解如何在我的应用程序中使用员工 ID 和员工姓名。

【问题讨论】:

请张贴您的网址... 你尝试了什么?在发布问题之前,您是否进行了任何研究? @Martin R:我做了太多的研究,我没有得到正确的解决方案,这就是我发布这个问题的原因。 但是你应该展示你已经尝试过的东西。显示您的代码、您得到的结果以及您的问题所在! NSURLurl = [NSURL URLWithString:@"XXXXXXXX.sr/LoginAuth.svc/Employee"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; if (request) [request setURL: url]; 连接 = [[NSURLConnection alloc] initWithRequest:request delegate:self]; - (void)connection:(NSURLConnection)connection didReceiveResponse:(NSURLResponse*)response; webData = [[NSMutableData alloc] init ]; 【参考方案1】:

您的 JSON 数据看起来像“嵌套 JSON”,这意味着您必须对其进行两次反序列化。

第一次反序列化从您的 JSON 数据中提取一个字符串:

NSData *response = ...; // your data
NSError *error;
NSString *innerJson = [NSJSONSerialization JSONObjectWithData:response
                              options:NSJSONReadingAllowFragments error:&error];

现在innerJson 是字符串

["EmployeeID":"000001","EmplyeeName":"ABCD EFGHI","EmployeeID":"000002","EmplyeeName":"ADGHT ASASASAS"]

这又是 JSON 数据。第二次反序列化提取数组:

NSArray *entries = [NSJSONSerialization JSONObjectWithData:[innerJson dataUsingEncoding:NSUTF8StringEncoding]
                              options:0 error:&error];

现在你可以像这样访问它了

for (NSDictionary *entry in entries) 
    NSString* employeeID = [entry objectForKey:@"EmployeeID"];
    NSLog(@"%@", employeeID);

【讨论】:

非常感谢 Martin R 和 Alex,它正在无缝运行。 从技术上讲,它只是“转义”,而不是“嵌套”。但是上面对 NSJSONSerialization 的使用是一种(几种)“取消转义”它的方法。 @HotLicks: 如果["foo":"bar"] 从服务器以"[\"foo\":\"bar\"]" 发送,那么 1) 所有引号都被转义并且 2) 结果用引号括起来。这就是为什么我认为它是一个 JSON 字符串对象,它的值(在这种情况下)是一个 JSON 数组对象,并选择了术语“嵌套 JSON”。 - 当然还有其他方法,但 NSJSONSerialization 对我来说似乎是最简单且最不容易出错的,例如,如果 ["foo\"bar"] 从服务器发送为 "[\"foo\\\"bar\"]" JSON 字符串仅有的两个合法的外部结构是“object”(字典)和“array”。 “String”不是独立的法律地位,这就是为什么您必须指定“AllowFragments”才能让解析器接受它。 (但是使用 NSJSONSerialization 来“取消转义”字符串是可以的,尽管毫无疑问有更快的方法,如果你真的很注重效率的话。) @HotLicks:我想我现在明白你的意思了。【参考方案2】:
NSData *response = ...;
NSArray *entries = [NSJSONSerialization JSONObjectWithData:response
                                                   options:0
                                                     error:nil];

for(NSDictionary* entry in entries) 
    NSString* employeeID = [entry objectForKey:@"EmployeeID"];

【讨论】:

谢谢 ALex,上面的代码没有运气,你能告诉我下面的代码哪里错了吗? - (void)connectionDidFinishLoading:(NSURLConnection*)connection NSString* s = [[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding];NSLog(@"response %@", s); NSData* 响应 = [s dataUsingEncoding:NSUTF8StringEncoding]; NSArray entries = [NSJSONSerialization JSONObjectWithData:response options:0 error:nil]; for(NSDictionary entry in entries) NSString* employeeID = [entry objectForKey:@"EmployeeID"]; NSLog(@"打印 %@", 员工 ID); 为什么不使用“NSData* response = webData;”? 用过的螺母没有运气显示没有结果 您尝试过 Martin R“嵌套 JSON”解决方案吗?看起来应该可以工作 非常感谢 Martin R 和 Alex,它正在无缝运行。【参考方案3】:

查看 JSON Parser,您的响应是 JSON,因此您需要从 json 获取该数据。

NSURL * url=[NSURL URLWithString:@"<YourURL>"];

NSData * data=[NSData dataWithContentsOfURL:url];

NSError * error;

NSMutableDictionary  * json = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error: &error];

NSLog(@"%@",json);


NSMutableArray * EmployeeID=[[NSMutableArray alloc]init];

NSMutableArray * EmployeeName=[[NSMutableArray alloc]init];

NSArray * responseArr = json[@"geonames"];

for(NSDictionary * dict in responseArr)


[EmployeeID addObject:[dict valueForKey:@"EmployeeID"]];
[EmployeeName addObject:[dict valueForKey:@"EmplyeeName"]];


现在你得到了 EmployeeID,EmployeeName 数组,你可以在任何你想要的地方使用。

【讨论】:

【参考方案4】:

看看:

NSJSONSerialization

【讨论】:

【参考方案5】:

使用这个:

NSData* yourData = [[NSData alloc] initWithContentsOfURL: yourURL];
NSarray* yourJSON = [NSJSONSerialization JSONObjectWithData:yourData options:kNilOptions error:nil];

希望对你有帮助:)

【讨论】:

【参考方案6】:

尝试使用这个:

NSDictionary *myJSON = [NSJSONSerialization JSONObjectWithData:myData options:NSJSONReadingMutableContainers error:nil];

【讨论】:

以上是关于如何解析收到的响应[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何实现“return true;”?错误:“消息端口在收到响应之前关闭。”

如何在颤动中解析此响应,并从 API 响应中的两个数组的文本字段中获取响应值? [关闭]

如何在自定义表格视图中解析 JSON 响应 [关闭]

如何修复“收到响应前消息端口已关闭”。在 javascript 中的 window.location.reload() 之后

JSON解析错了吗? [关闭]

客户端在收到整个响应之前关闭连接 AFNetworking