2

这是我到目前为止的代码

// 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 脚本中回显这些数据。我只是做错了,还是我错过了什么?

4

3 回答 3

4

您的问题是,当您收到错误时,您会返回 anNSDictionary而不是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. 不要调用你的 object JsonArray,因为它并不总是一个数组。调用它jsonObject

  2. 不要以大写字母开头的变量名。

于 2013-11-09T19:26:48.890 回答
0
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:myData options:NSJSONReadingMutableContainers error:&error];
NSLog(@"jsonDic: %@", [jsonDic objectForKey:@"string"]);
于 2013-11-09T19:19:22.830 回答
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 在被要求打印对象时调用以找出要打印的内容。对于具有单个键“error”和值 0 的 NSDictionary,它会返回类似于“error:0”的内容,这当然与“error”不同。

于 2014-02-13T00:22:17.460 回答