Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从NSArray/NSDictionary中的空键获取值_Ios_Objective C_Json - Fatal编程技术网

Ios 从NSArray/NSDictionary中的空键获取值

Ios 从NSArray/NSDictionary中的空键获取值,ios,objective-c,json,Ios,Objective C,Json,我需要从json中取出值。我的json值如下所示: [{"status":1,"data":[{"":558202}]}] 我尝试了几种在stackoverflow中发布的方法。但我仍然没有得到我的愿望 我最接近的结果是 ( 558202 ) 但我只需要558202。 我试过了 NSArray *jsonObject = [NSJSONSerialization JSONObjectWithData:[resultStr dataUsingEncoding:NSUTF8StringEnc

我需要从json中取出值。我的json值如下所示:

[{"status":1,"data":[{"":558202}]}]
我尝试了几种在stackoverflow中发布的方法。但我仍然没有得到我的愿望

我最接近的结果是

(
558202
)
但我只需要558202。 我试过了

  NSArray *jsonObject = [NSJSONSerialization JSONObjectWithData:[resultStr dataUsingEncoding:NSUTF8StringEncoding]options:0 error:NULL];
  NSDictionary *tableData = [jsonObject valueForKey:@"data"];
  NSString *tempData=[tableData objectForKey:@""];
当我使用上述方法时,我得到一个错误:

-[\uu NSArrayI objectForKey:]:未识别


数据
的对象不是字典,而是包含一个字典的数组

事实上,错误消息确实告诉您这一点

--[__NSArrayI objectForKey:] : unrecognized
     ^^^^^^^^ is a subclass of NSArray
你真的需要

NSArray *jsonObject = [NSJSONSerialization JSONObjectWithData:[resultStr dataUsingEncoding:NSUTF8StringEncoding]options:0 error:NULL];
NSArray *tableData = [[jsonObject objectAtIndex: 0] objectForKey:@"data"];
NSString *tempData=[[tableData objectAtIndex: 0] objectForKey:@""];
注意
valueForKey:
处理数组的原因是,对于数组,它实际上将
valueForKey:
应用于数组中的每个元素,并返回一个包含所有结果的数组

编辑

上面的代码可以编写

NSString *tempData = jsonObject[0][@"data"][0][@""];
使用现代语法。但是正如rmaddy在下面所说的,不要链接这样的东西,因为JSON集合中的元素可以是任何JSON兼容的类型,所以在现实生活中,你必须检查你得到了什么类型的对象,例如

id jsonObject = [NSJSONSerialization JSONObjectWithData:[resultStr dataUsingEncoding:NSUTF8StringEncoding]options:0 error:NULL];

if ([jsonObject isKindOfClass: [NSArray class]])
{
    id firstElement = jsonObject[0];      
    if ([firstElement isKindOfClass: [NSDictionary class]])
    {
        id data = firstElement[@"data"];

    // etc
    }
}
else
{
    // errror
}

阅读完整的错误。您将
NSArray
视为
NSDictionary
。使用现代语法的强大功能,您只需执行以下操作:
NSString*tempData=jsonObject[0][@“data”][0][@”“]。但请注意,我说“可以”。不要。使用现代语法,但不要将4个访问链接在一起。调试是不可能的。@rmaddy这是真的。我没有这么做的两个原因。1.在现实生活中,您需要检查每一步接收的对象类型,因为JSON集合中的元素可以是任何合法的JSON类型(即,绝对没有链接)。2.我对现代语法不太熟悉,必须对其进行编译以确保正确无误,而且我很懒。@JeremyP从不使用
someArray[0]
!如果你知道你正在访问第一个对象
[someArray firstObject]
是一种更安全的方法。不,实际上最好在取出数组之前检查数组中是否有任何内容。谢谢@Jeremy。它成功了:)。正如我所知,由于将NSArray视为NSDictionary,我得到了一个错误,但我也提到,通过使用NSArray,我得到了小括号中的值:比如(23456)。所以我试着用字典法。不过,这两种方法都值得一试:)再次非常感谢杰里米