这是我到目前为止的代码
// 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脚本中回显这些数据。我只是做错了,还是我错过了什么?
答案 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
}
文体建议:
不要调用您的对象JsonArray
,因为它并不总是一个数组。称之为jsonObject
。
不要使用大写字母启动变量名称。
答案 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”的内容,这当然与“错误”不同。