14

我从 Web 服务中解析了一些 JSON,这给了我一个 NSDictionary,我使用这个字典来填充 NSObject 类型的 valueEntity 的属性

[myObject setValuesForKeysWithDictionary:JSONDict];

(myObject 具有与 JSON 解析器中的字典相同的属性名称和类型)

name = name
count = count
startDate = startDate
etc..

有没有办法走另一条路,我有一个 NSDictionary,我想用我的 NSObject 子类中的属性及其值“填充”它。就像我在标题中建议的那样,大致如下:

单程

MyObject *myObject = [[MyObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];

另一种方式

NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties];

这样做的原因是我有一个 valueEntity,根据协议,我的视图都符合,但我也想用这些值填充一个 NSManagedObject。所以我认为使用 NSDictionary 作为中间步骤,我可以绕过必须在我的 NSManagedObject 上执行一个类别,该类别从我的对象子类 NSObject 上的值手动设置每个属性。

有了字典,我可以去:

[myManagedObject setValuesForKeysWithDictionary:dict];

完成上述操作后,我就是无法恢复字典表示?

4

3 回答 3

17

是的,方法是:

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys

您传入一个表示您感兴趣的对象属性的键数组,并返回一个包含属性值的字典。

NSKeyValueCoding协议定义了许多强大且非常有用的方法;熟悉这是一件很棒的事情。

http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html

还有一个非常有价值的同伴指南:

http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html#//apple_ref/doc/uid/10000107i

于 2010-09-14T19:18:23.923 回答
5

你真的想得到所有的属性吗?通常将对象的所有属性作为字典获取是没有意义的。例如,如果 anNSManagedObject包含关系,您是否也想在字典中获取它?如果是这样,你想如何表示它?

正如 jlehr 所说,最好使用dictionaryWithValuesForKeys:.

也就是说,使用可怕的 Objective-C 运行时,你确实可以实现makeDictionaryWithObjectProperties. 使用class_getPropertyListproperty_getName。我不会详细说明如何做到这一点,因为如果你遵循这种方法,你就会知道你在做什么。

顺便说一句,JSON将从 Internet 返回的对象分配给NSManagedObjectusing是非常危险的setValuesForKeysWithDictionary:。因为,如果JSON对象碰巧包含您不期望的附加键,您的代码可能会突然崩溃。所以,不要那样做

另一条评论:你的伪代码

NSObject *myObject = [[NSObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];

没有多大意义:是的,你可以打电话setValuesForKeysWithDictionary:反对NSObject,但它会惨败,因为你不能为vanillasetValue:forKey:的任何条目。我想你知道这一点,但我想明确地说出来,以免遇到此页面的新手被愚弄。JSONDictNSObject

于 2010-09-14T19:23:49.700 回答
1

这里的这个人使用了一些运行时魔法来获取对象上声明的所有属性并获取字典,而无需手动提供属性名称。

我还发现了这个不错的 github存储库,他们几乎做同样的伎俩,但在一个不错的包中。他们还能够从对象创建 json 或 plist。

于 2011-12-19T20:58:24.413 回答