使用 iOS 5 应用程序从 .Net Web 服务消费和解析 JSON 数据
Posted
技术标签:
【中文标题】使用 iOS 5 应用程序从 .Net Web 服务消费和解析 JSON 数据【英文标题】:Consuming and Parsing JSON data from .Net web service using iOS 5 application 【发布时间】:2013-02-18 09:32:05 【问题描述】:我的 .Net 网络服务 url 是:http://xx.xx.xx.xxx/iosCalender/service1.asmx,这是一个名为“getDataFromMaster”的方法名称,它返回 JSON 数据如下(我不知道为什么不同的浏览器显示不同的输出):
从 safari 运行时:
[
"Training_Code": "1234 ",
"Training_Duration": "2hrs ",
"Training_Startdate": "14/02/2013 15:00:00",
"Training_Enddate": "14/02/2013 17:00:00",
"Trainer_ID": 1,
"Training_Location": "B-Wing Training room-4",
"Comments": "C# training",
"Keyword": "C#1234",
"NumberofDays": 1
,
"Training_Code": "4321 ",
"Training_Duration": "16 ",
"Training_Startdate": "17/02/2013 10:30:00",
"Training_Enddate": "17/02/2013 17:30:00",
"Trainer_ID": 2,
"Training_Location": "A-Wing Training Room-6",
"Comments": "Objective-C",
"Keyword": "Obj-C4321",
"NumberofDays": 2
]
从 IE 运行时:
<?xmlversion="1.0"encoding="UTF-8"?><stringxmls="http://tempuri.org/">
[
"Training_Code": "1234 ",
"Training_Duration": "2hrs ",
"Training_Startdate": "14/02/2013 15:00:00",
"Training_Enddate": "14/02/2013 17:00:00",
"Trainer_ID": 1,
"Training_Location": "B-Wing Training room-4",
"Comments": "C# training",
"Keyword": "C#1234",
"NumberofDays": 1
,
"Training_Code": "4321 ",
"Training_Duration": "16 ",
"Training_Startdate": "17/02/2013 10:30:00",
"Training_Enddate": "17/02/2013 17:30:00",
"Trainer_ID": 2,
"Training_Location": "A-Wing Training Room-6",
"Comments": "Objective-C",
"Keyword": "Obj-C4321",
"NumberofDays": 2
]</string>
我正在尝试从我的 iOS 应用程序中解析 JSON,如下所示:
-(void)loadCalendarView
if(x==0)
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Failed" message:@"Authentication failed" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
else if(x==1)
[self ParseJSONdataFromMasterTraining];
[self.navigationController pushViewController:self.viewController animated:YES];
-(void)ParseJSONdataFromMasterTraining
dispatch_sync(kBgQueue, ^NSData *data = [NSData dataWithContentsOfURL:URLMasterTraining];
[self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
);
-(void)fetchedData:(NSData*)responseData
NSError *err;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&err];
NSLog(@"jsonDict = %@",json);
NSArray *trainingDetails = [json objectForKey:@"iOSCalender"];
NSLog(@"getDataFromTrainingMaster = %@",trainingDetails);
我无法获取数据,我的“trainingDetails”显示为空。
注意:我为此尝试了“dispatch_sync”和“dispatch_async”方法,但仍然遇到同样的问题。
任何人都可以指导我,我要去哪里以及如何纠正这个问题?谢谢。
【问题讨论】:
您在 WS 输出中没有任何名为@"iOSCalender"
的条目,因此 trainingDetails
获得 null
值是正常的,您可以 NSLog
json
字典和发布结果?
我的 json 字典也是 null。我的 web 服务输出或 JSON 数据没有@"iOSCalender"。我该怎么做?
1.我不想变得微不足道,但是您使用什么编码?在 cp1251 的情况下,答案是显而易见的。 2.能否打印responseData转换为编码类型为4的NSString?
得到这样的数据:ResponseData = 什么是编码类型4?我该怎么做??
【参考方案1】:
好的,您的示例 JSON 是一个字典数组。您获取 iOSCalendar 的代码将不起作用,并且应该抛出错误,因为数组没有 objectForKey: 那就是如果您在 JSON 对象中获取某些内容。
您是否查看了您的 err 变量。如果你得到一个空值,你应该看看。
您可以将 NSData 输出为字符串。
NSString *s = [NSString alloc] initWithData: responseData encoding: NSUTF8String];
打印出来看看你得到了什么。只需查看您的数据输出,您就会得到以
开头的内容<html
那不是 JSON
【讨论】:
是的,我得到了 我正在尝试这样做: NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&err]; NSArray *arr = [json objectForKey:@"Training_Code"]; NSLog(@"JSoN = %@",arr);我仍然是空的。 我的 json 对象是否正确?询问是因为,在方括号 [ 之前没有任何内容可以传递给“ObjectForKey”方法。以上是关于使用 iOS 5 应用程序从 .Net Web 服务消费和解析 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章
从托管为 Azure Web App 的 ASP.NET 5 应用程序记录日志
在 Visual Studio 2010 中使用 ASP.NET MVC2 Web 应用程序以 .NET3.5 为目标?
ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十四)之漏掉的客服消息