使用 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 服务输出或 JS​​ON 数据没有@"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 数据的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS 上的 .net Web 服务获取数据

从托管为 Azure Web App 的 ASP.NET 5 应用程序记录日志

在 Visual Studio 2010 中使用 ASP.NET MVC2 Web 应用程序以 .NET3.5 为目标?

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十四)之漏掉的客服消息

尝试使用 .NET 5.0 Web 应用程序执行存储过程时出现转换错误

ASP.NET 5 ,想要将实体框架从 Web 项目中分离出来