gpt4 book ai didi

Objective-C - 将类属性与 json 字典数据对齐

转载 作者:行者123 更新时间:2023-12-03 16:58:09 25 4
gpt4 key购买 nike

我对 Objective-C 比较陌生(主要使用 cocoa/apple 基础框架),但是是一名长期的 C++ 程序员,所以我将首先解释我想要完成的任务;我的方法很可能不是最好的,所以我很想听到任何关于不同方法的建议。

我有一个 json 格式的文本文件,只是做了这个简单的例子:

"section1" : {
"director" : "Sample Name 1",
"writers" : {
"name" : "Example Name 1",
"name" : "Example Name 2",
},
},

我有一个类,其中的属性我想与该文件中的数据匹配,因为我计划解析该文件并将一些值存储在该类的实例中。我的类标题大致如下所示:

@interface SongData : NSObject
@property (nonatomic, copy) NSString *director;
@property (nonatomic, copy) NSArray *writers;
@end

所以我试图找到最干净、有点“数据驱动”的方式来将此 json 数据存储到正确的属性中。基本上我想要一种方法来循环数据的 json“字典”,并以某种方式使用“键”来匹配我的类中的正确属性并将值分配给该属性。我的第一次破解是,我创建了一个字典,其中“键”是在 json 数据中查找正确数据的实际键,“值”将是指向正确类属性的指针。有点像这样:

NSDictionary *descriptionDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
director, @"name",
writers, @"writers",
nil];

然后的想法是循环遍历 json 数据(存储在另一个 NSDictionary 中),使用“descriptionDictionary”中的每个键在 json 数据中查找适当的值,然后使用描述的匹配“值”基于相同键的字典(我希望它是指向实际类属性的指针?)并将该属性值设置为 json 数据中的值。也许一个例子会让它更清楚:-)。假设“jsonDictionary”是解析我的json数据的结果,并且我已经在section1中,所以组成jsonData NSDictionary的键和组成我的descriptionDictionary NSDictionary的键之间应该有1-1的匹配:

[descriptionDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
value = [jsonDictionary objectForKey:propertyName];
}];

现在“value”从技术上讲将指向我的类属性之一,并且我想为其分配相关的json数据(即director = @“Sample Name 1”)。我知道我正在做的事情存在问题(我意识到我可能不能只是取消引用指向随机类属性的指针并为其分配未知类型的任意对象,希望它全部匹配:-),但希望我的示例至少说明了我正在尝试做的事情,以便有人可以告诉我更好的方法。

最佳答案

看看 KVC(来源:http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/BasicPrinciples.html)

Setting Attribute Values Using Key-Value Coding

The method setValue:forKey: sets the value of the specified key, relative to the receiver, to the provided value. The default implementation of setValue:forKey: automatically unwraps NSValue objects that represent scalars and structs and assigns them to the property. See “Scalar and Structure Support” for details on the wrapping and unwrapping semantics.

If the specified key does not exist, the receiver is sent a setValue:forUndefinedKey: message. The default implementation of setValue:forUndefinedKey: raises an NSUndefinedKeyException; however, subclasses can override this method to handle the request in a custom manner.

The method setValue:forKeyPath: behaves in a similar fashion, but it is able to handle a key path as well as a single key.

Finally, setValuesForKeysWithDictionary: sets the properties of the receiver with the values in the specified dictionary, using the dictionary keys to identify the properties. The default implementation invokes setValue:forKey: for each key-value pair, substituting nil for NSNull objects as required.

One additional issue that you should consider is what happens when an attempt is made to set a non-object property to a nil value. In this case, the receiver sends itself a setNilValueForKey: message. The default implementation of setNilValueForKey: raises an NSInvalidArgumentException. Your application can override this method to substitute a default value or a marker value, and then invoke setValue:forKey: with the new value.

只要您的类属性与 JSON 字段具有相同的名称,您就可以使用 setValuesForKeysWithDictionary: 并传入 JSON 根字典。

对于名称不同的键/属性,您只需覆盖 setValue:forUndefinedKey: 并自行设置适当的属性。

最后还有一种情况,即 JSON 中的值由与属性中不同的类型表示。例如 NSURL 将是一个 NSString。这里你可以简单地检查传递参数的类,如果它与IVAR不匹配,则进行转换。

关于Objective-C - 将类属性与 json 字典数据对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14080976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com