使用嵌套对象和键对数组建模
Posted
技术标签:
【中文标题】使用嵌套对象和键对数组建模【英文标题】:Modeling out an array with nested objects and keys 【发布时间】:2014-01-01 18:05:54 【问题描述】:我一直在寻找如何为下面的数组建模。我通过tide.tideSummary
访问这个数组 - 我已经尝试过自己建模具有 1 级数据的基本字典的示例,但这有嵌套数据。我正在研究看起来很棒的 JSONModel,但我认为它不能深入嵌套字典?
我知道如何获取单个对象,例如 data
并获取 pretty
- 但我想显示几个部分并尝试通过以下方式显示它们:(我会在我的头文件中声明每个对象)。
self.date.pretty
self.data.type
等
有这样做的想法吗?我认为循环遍历每个项目并添加到一个新对象将是矫枉过正,似乎太多的工作和处理来做我需要做的事情。
"tideSummary": [
"date":
"pretty": "11:58 AM PST on December 19, 2013",
........
,
"utcdate":
"pretty": "7:58 PM GMT on December 19, 2013",
........
,
"data":
"height": "5.97 ft",
"type": "High Tide"
,
........,
........,
这是我目前的解决方案:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
NSDictionary *eachTideSummary = [TideModel tideSingleton].tideSummary[indexPath.row];
NSDictionary *dataDic = [eachTideSummary objectForKey:@"data"];
NSDictionary *dateDic = [eachTideSummary objectForKey:@"date"];
NSLog(@"Pretty date: %@", [dateDic objectForKey:@"pretty"]);
NSLog(@"Data type: %@", [dataDic objectForKey:@"type"]);
cell.textLabel.text = [dataDic objectForKey:@"type"];
return cell;
想听听任何想法或建议吗?谢谢
【问题讨论】:
您可以使用KVC(提取单元格所需的对象后):[eachTideSummary valueForKeyPath:@"data.height"]
@DanShelly 谢谢,性能/最佳实践是“可以接受的”。我目前的解决方案就是这样做。
【参考方案1】:
看看 github 上的Mantle Framework。它易于使用且功能强大。
更新:
#import <Specta.h>
#import <Expecta.h>
#import <Mantle.h>
#pragma mark GIInterfaces
@interface GIDate : MTLModel <MTLJSONSerializing>
@property (nonatomic, strong) NSString *pretty;
@end
@interface GIUtcDate : MTLModel <MTLJSONSerializing>
@property (nonatomic, strong) NSString *pretty;
@end
@interface GIData : MTLModel <MTLJSONSerializing>
@property (nonatomic, strong) NSString *height;
@property (nonatomic, strong) NSString *type;
@end
@interface GITide : MTLModel <MTLJSONSerializing>
@property (nonatomic, strong) GIDate *date;
@property (nonatomic, strong) GIUtcDate *utcDate;
@property (nonatomic, strong) GIData *data;
@end
@interface GITideSummary : MTLModel <MTLJSONSerializing>
@property (nonatomic, strong) NSArray *tides;
@end
#pragma mark - GIImplementation
@implementation GIDate
+ (NSDictionary*)JSONKeyPathsByPropertyKey
return @@"pretty": @"pretty";
@end
@implementation GIUtcDate
+ (NSDictionary*)JSONKeyPathsByPropertyKey
return @@"pretty": @"pretty";
@end
@implementation GIData
+ (NSDictionary*)JSONKeyPathsByPropertyKey
return @@"height": @"height",
@"type" : @"type";
@end
@implementation GITide
+ (NSDictionary*)JSONKeyPathsByPropertyKey
return @@"date": @"date",
@"utcDate" : @"utcdate",
@"data": @"data";
+ (NSValueTransformer*)dateJSONTransformer
return [MTLValueTransformer mtl_JSONDictionaryTransformerWithModelClass:[GIDate class]];
+ (NSValueTransformer*)utcDateJSONTransformer
return [MTLValueTransformer mtl_JSONDictionaryTransformerWithModelClass:[GIUtcDate class]];
+ (NSValueTransformer*)dataJSONTransformer
return [MTLValueTransformer mtl_JSONDictionaryTransformerWithModelClass:[GIData class]];
@end
@implementation GITideSummary
+ (NSDictionary*)JSONKeyPathsByPropertyKey
return @@"tides" : @"tideSummary";
+ (NSValueTransformer*)tidesJSONTransformer
return [MTLValueTransformer mtl_JSONArrayTransformerWithModelClass:[GITide class]];
@end
SpecBegin(MantleTestClass)
it(@"should initialize GITideSummary from JSON", ^
NSDictionary *values =
@
@"tideSummary": @[@
@"date": @
@"pretty": @"11:58 AM PST on December 19, 2013"
,
@"utcdate": @
@"pretty": @"7:58 PM GMT on December 19, 2013",
,
@"data": @
@"height": @"5.97 ft",
@"type": @"High Tide"
]
;
NSError *error = nil;
GITideSummary *summary = [MTLJSONAdapter modelOfClass:[GITideSummary class]
fromJSONDictionary:values
error:&error];
expect(summary).to.beKindOf([GITideSummary class]);
expect(summary.tides.count).to.equal(1);
GITide *tide = summary.tides[0];
expect(tide).to.beKindOf([GITide class]);
expect(tide.data).to.beKindOf([GIData class]);
expect(tide.data.height).to.equal(@"5.97 ft");
);
SpecEnd
【讨论】:
我查看了那个和 JSONModel。它是否能够使用具有多个对象的数组。它们几乎是父模型的子模型? 是的,您可以编写自己的转换器。例如:github.com/MantleFramework/Mantle/issues/155 啊,该示例使用该数组中的 1 个对象。访问类似于我上面发布的数据集的嵌套将如何工作? w8 秒,我会尝试写这个然后我会提交代码 现在就开始吧!GI
前缀代表什么?以上是关于使用嵌套对象和键对数组建模的主要内容,如果未能解决你的问题,请参考以下文章
谁有关于delphi组建和对象的英文表,注意是英文表。50分悬赏。