2013-11-09 45 views
2

这是我的代码至今解析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}] 

这只是给我的字符串“错误”,而不是INT以及:

{"error":0} 

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

+0

@ H2CO3抱歉,感谢您的编辑。 –

+0

除此之外:你想检查是否有关键错误的对象(即if(event [@“error”]!= nil)')。 – 2013-11-09 19:13:18

+0

@ H2CO3我试着用[event objectForKey ...但是我得到了Sigabrt。 –

回答

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. 不要用大写字母开始变量名称。如果你已经张贴你试图解析完整的JSON文件,因为不这样做,是绝对没有机会弄清楚你的代码是否正确附近的任何地方

+0

在你的回答中,你能解释为什么不使用大写字母吗?这真的有帮助,让我试试。 –

+0

@EliteGamer因为这是一个惯例。 – 2013-11-09 19:29:47

+0

你能解释一下你的意思吗? –

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

你可以尝试以上 – Parthi

+0

这将失败的任何错误的输入。 – 2013-11-09 19:20:19

+0

@Parthi,他是对的。我一直都不会有错误。 –

0

将是巨大的。你给出的例子[{data string},{data strings}]绝对不是正确的JSON文档,所以试图解析它将返回nil。 {“error”:0}是一个带有单个键“错误”和值为0的字典。使用单个键的字典可以说是不寻常的。

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

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

并查找“描述”方法的作用。 “描述”是NSLog在打印对象时要求打印什么内容。对于只有一个键“错误”且值为0的NSDictionary,它会返回类似“error:0”的东西,这当然与“error”不一样。