使用NSJSONSerialization问题解析JSON字符串和数组?

时间:2013-11-09 19:10:38

标签: objective-c json nsjsonserialization

这是我到目前为止的代码

// Parse data using NSJSONSerialization
NSError *error = nil;
NSArray *JsonArray = [NSJSONSerialization JSONObjectWithData:myData options:NSJSONReadingMutableContainers error: &error];
if(!JsonArray)
{
    NSLog(@"Error Parsing Data: %@", error);
}
else
{
    for(NSDictionary *event in JsonArray)
    {
        if([[event description] isEqualToString:@"error"])
        {
            // Get error number? I am confused by this part
            NSLog(@"Element: %@", [event objectForKey:@"error"]);
        }
        else
        {
            NSLog(@"Element: %@", [event description]);
        }
    }
}

这是正确解析的JSON数据:

[{data string}, {data strings}]

这只给我字符串“error”而不是int:

{"error":0}

如果有帮助,我会从PHP脚本中回显这些数据。我只是做错了,还是我错过了什么?

3 个答案:

答案 0 :(得分:4)

您的问题是,当您收到错误时,您会收到NSDictionary而不是NSArray。这应该有效:

if ([jsonObject isKindOfClass:[NSArray class]]) {
    // no error: enumerate objects as you described above
} else if ([jsonObject isKindOfClass:[NSDictionary class]]) {
    // error: obtain error code
    NSNumber *errCode = jsonObject[@"error"];
} else {
    // something bad's happening
}

文体建议:

  1. 不要调用您的对象JsonArray,因为它并不总是一个数组。称之为jsonObject

  2. 不要使用大写字母启动变量名称。

答案 1 :(得分:0)

NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:myData options:NSJSONReadingMutableContainers error:&error];
NSLog(@"jsonDic: %@", [jsonDic objectForKey:@"string"]);

答案 2 :(得分:0)

如果你发布了你想要解析的完整JSON文档会很棒,因为没有它,你绝对没有机会弄清楚你的代码是否接近正确。您提供的示例[{data string},{data strings}]绝对不是正确的JSON文档,因此尝试解析它将返回nil。 {“error”:0}是一个包含单个键“error”和值0的字典。使用单个键的字典让我们说不寻常。

JSON文档包含一个数组或对象(使用JSON术语),它将被转换为NSArray *或NSDictionary *。你应该知道你是否期望一个数组或字典。如果您期望NSArray,请检查[jsonObject isKindOfClass:[NSArray class]]。如果您需要NSDictionary,请检查[jsonObject isKindOfClass:[NSDictionary class]]。如果您不这样做,那么错误的JSON文档将导致您的应用程序崩溃或产生完全废话。

如果你有一个数组,那么你通常会遍历数组的元素并依次处理每个元素。如果您有字典,通常会查找您知道如何处理的键。你正在做什么,遍历一个字典数组,并检查一个带有“错误”键的字典,这是你的JSON文档的一个非常奇怪的设计。

查找“描述”方法的功能。 “description”是NSLog调用的,用于在要求打印对象时找出要打印的内容。对于具有单个键“错误”和值0的NSDictionary,它将返回类似“错误:0”的内容,这当然与“错误”不同。