我正在尝试从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”发回。这有什么区别吗?如果是这样,我应该将它发送回什么数据类型?
任何想法都将不胜感激!
答案 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"];
}