如何从 NSDictionary 获取整个对象

Posted

技术标签:

【中文标题】如何从 NSDictionary 获取整个对象【英文标题】:How to Get Entire object from NSDictionary 【发布时间】:2016-05-16 06:25:51 【问题描述】:

这是我的数据。

NSDictionary *dictResponse = [[NSDictionary alloc]init];

//Here is dictResponse value is

(

    "created_on" = "0000-00-00 00:00:00";
    id = 627;
    "modified_on" = "0000-00-00 00:00:00";
    name = "";
    "user_id" = 99;
,



    "created_on" = "2016-05-06 14:43:45";
    id = 625;
    "modified_on" = "2016-05-06 14:43:45";
    name = Ggg;
    "user_id" = 99;
,


    "created_on" = "2016-05-03 17:21:52";
    id = 623;
    "modified_on" = "2016-05-03 17:21:52";
    name = Qwerty;
    "user_id" = 99;
,

    "created_on" = "2016-04-29 20:12:38";
    id = 601;
    "modified_on" = "2016-04-29 20:12:38";
    name = Teat2;
    "user_id" = 99;
,


    "created_on" = "2016-04-29 20:12:27";
    id = 600;
    "modified_on" = "2016-04-29 20:12:27";
    name = Test1;
    "user_id" = 99;
,


    "created_on" = "2016-05-09 13:04:00";
    id = 626;
    "modified_on" = "2016-05-09 13:04:00";
    name = Testios;
    "user_id" = 99;
)

现在我想访问完整的一组对象,即



    "created_on" = "2016-04-29 20:12:27";
    id = 600;
    "modified_on" = "2016-04-29 20:12:27";
    name = Test1;
    "user_id" = 99;
 

来自我的 dictResponse

所以当我使用 dictResponse[0] 或 dictResponse1 .. 出现错误,那么如何从 NSDictionary 检索整个集合?

请检查下面的控制台日志输出。

【问题讨论】:

您发布的字典 (dictResponse) 不是有效的字典。每个内部字典必须由 key 表示。 您的响应是一个字典数组。 正确,您的响应是字典数组,您可以根据要求使用它的索引检索条目。 是的,我知道这不是有效的字典值,但有可能在 NSDictionary 中得到类似的值,所以问题没有错,是的,我的回答是字典数组。意味着从控制台日志我可以给 dictResponse[0] 并按预期打印第一部分。 @ozgur 我已经更新了我的回复,添加了通用括号() 【参考方案1】:

你可以这样做:

id arrResponse = dictResponse;
if ([arrResponse isKindOfClass:[NSArray class]] && arrResponse != nil && arrResponse != (id)[NSNull null])

   NSArray *arrResults =  arrResponse;          
//if you want retrieve specific entries then here is the code for that
for (int i = 0 ; i<arrResults.count; i++) 
       NSString *strName = [[arrResults objectAtIndex:i]valueForKey:@"name"];
       NSString *strCreated_on = [[arrResults objectAtIndex:i]valueForKey:@"created_on"];
       NSString *strModified_on = [[arrResults objectAtIndex:i]valueForKey:@"modified_on"];
       NSInteger userID = [[arrResults objectAtIndex:i]valueForKey:@"user_id"];
       
   

【讨论】:

是的,这有帮助!,谢谢!【参考方案2】:

您不能使用索引(如 dictResponse[0])访问字典中的对象。字典中的对象没有索引,它们有键。要从字典中获取对象,请使用 objectForKey 方法:

NSObject* myObject = [dictResponse objectForKey:@"my_key"];

【讨论】:

如果keyname 那么会得到哪个名字? 在将对象添加到字典时设置键。因此,只要在将名称为“Test1”的对象添加到字典时使用了键“Test1”,您就可以使用 [dictResponse objectForKey:@"Test1"]; 检索它 这里keyname,值是Test1所以你不能做[dictResponse objectForKey:@"Test1"]; 这里我只能拿到一套钥匙!【参考方案3】:

您的问题没有提供足够的细节,因此以下是猜测:

所以当我使用dictResponse[0]dictResponse[1] .. 时出现错误

你永远不会说你遇到了什么错误。我猜你得到一个 compile 错误而不是执行错误?

您似乎知道您的代码在您编写的 cmets 中是错误的:

是的,我知道这不是有效的字典值,但可以在 NSDictionary 中获得类似的值,所以问题没有错,是的,我的回答是字典数组。意味着从控制台日志我可以给出 dictResponse[0] 并按预期打印第一部分。

确切地说,您可以打破类型系统并将数组引用存储到一个类型为保存字典引用的变量中,但这样做不是一个好主意!

当编译器看到dictResponse[0] 时,它会在语法上将其识别为数组索引操作,因此它会在dictResponse 上查找执行数组索引的方法。它只知道dictResponse,记住这是发生在编译器时,你已经声明它是NSDictionary *,所以它会寻找NSDictionary 支持的数组索引方法和没有找到,报错:

读取“NSDictionary *”类型对象上未找到的数组元素的预期方法

尝试正确键入您的变量,看看您的代码是否有效。

HTH

【讨论】:

以上是关于如何从 NSDictionary 获取整个对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从 NSDictionary 中获取 NSArray 名称?

PHP json_encode() 与空 NSDictionary

从 NSDictionary 中按键获取具有特定值的对象

如何将对象从 fetchedResultsController 到 Plist?

NSDictionary 和核心数据

如何从 NSArray 中获取图像 URL?