【问题标题】:JSON String Will Not ParseJSON 字符串不会解析
【发布时间】:2012-02-28 14:55:39
【问题描述】:

我正在尝试从 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 服务正在将数据作为数据类型“字符串”发回。这有什么区别吗?如果是这样,我应该将它发送回什么数据类型?

任何想法将不胜感激!

【问题讨论】:

  • 我正在尝试解析相同类型的 dic。并遇到问题。 @NeedSomeAnswers,如果您有任何解决方案并发布。

标签: ios json parsing ios5


【解决方案1】:

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

isValidJSONObject:

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

+ (BOOL)isValidJSONObject:(id)obj

参数:

obj
要测试的对象。


返回值:

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

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

【讨论】:

  • 那么,这是否意味着 NSDictionary 不是用于解析的有效对象?
  • @NeedSomeAnswers:我认为是;只要确保你通过了正确的选择。
【解决方案2】:

Web 服务也有可能以错误的编码传递 JSON 字符串。

根据NSJSONSerialization Class Reference!

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

【讨论】:

  • 谢谢摩托。我尝试了以下代码 - NSLog(@"%@", [jsonResponse objectForKey:@"First_Name"]);但我收到一条消息,上面写着“无法识别的选择器已发送到实例”。当我查看字典的键时,它说我没有。
  • 我可以在IOS端编码,还是必须在web服务端编码?
【解决方案3】:

您应该阅读 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"];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多