JSON字符串不会解析

时间:2012-02-28 14:55:39

标签: ios json parsing ios5

我正在尝试从Web服务解析JSON字符串。进入的字符串如下所示:

{
"Faculty_Members": [
    {
        "ID": 3377,
        "First_Name": "John",
        "Last_Name": "Doe"
    }
]
}

我的IOS代码如下所示:

NSURL *jsonUrl = [NSURL URLWithString:@"http://website/Service1.svc/Names"];
NSError *error = nil;
NSData *jsonData = [NSData dataWithContentsOfURL:jsonUrl options:kNilOptions error:&error];
NSMutableDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];
NSLog(@"%@",jsonResponse);

//parse out the json data
if([NSJSONSerialization isValidJSONObject:jsonResponse])
{
NSLog(@"YEP");
  }else{
NSLog(@"NOPE");
}

日志将显示正确的JSON数据,但我一直在isValidJsonObject上获得“NOPE”。

Web服务将数据作为数据类型“string”发回。这有什么区别吗?如果是这样,我应该将它发送回什么数据类型?

任何想法都将不胜感激!

3 个答案:

答案 0 :(得分:3)

您不使用isValidJSONObject:来测试有效的JSON字符串,而是使用它来测试可以转换为JSON的对象;见the documentation

  

isValidJSONObject:

     

返回一个布尔值,指示是否可以将给定对象转换为JSON数据。

+ (BOOL)isValidJSONObject:(id)obj
     

参数:

     
obj
要测试的对象。
     


     

返回值:

     

如果obj可以转换为JSON数据,则为YES,否则为NO。

相反,只需像往常一样使用JSONObjectWithData:来解析数据;如果失败,它将在NSError中返回error

答案 1 :(得分:0)

Web服务也可能以错误的编码提供JSON字符串。

根据NSJSONSerialization Class Reference

数据必须采用JSON规范中列出的5种支持编码之一:UTF-8,UTF-16LE,UTF-16BE,UTF-32LE,UTF-32BE。数据可能有也可能没有BOM。用于解析的最有效编码是UTF-8,因此如果您可以选择对传递给此方法的数据进行编码,请使用UTF-8。

答案 2 :(得分:0)

您应该阅读JSON。 {}表示字典。 []表示数组

因此,您返回的JSON对象是一个包含包含字典的数组的字典。要获取内容,您可以尝试以下操作:

// YOUR CODE
NSURL *jsonUrl = [NSURL URLWithString:@"http://website/Service1.svc/Names"];
NSError *error = nil;
NSData *jsonData = [NSData dataWithContentsOfURL:jsonUrl options:kNilOptions error:&error];
NSMutableDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];
NSLog(@"%@",jsonResponse);

// MY ADDITIONS
NSArray *facultyMembers = [jsonResponse objectForKey:@"Faculty_Members"];
NSDictionary *facultyMember = [facultyMembers objectAtIndex:0];

甚至

for(NSDictionary *dict in jsonResponse)
{
    // parse contents of dict; perhaps store in temp object and add to 
    // mutable dictionary or array
    NSNumber *ID = [dict objectForKey@"ID"];
    NSString *firstName = [dict objectForKey@"First_Name"];
    NSString *lastName = [dict objectForKey@"Last_Name"];
}