Ios 使用嵌套对象和键对阵列进行建模
我一直在四处寻找如何对下面的数组进行建模。我通过Ios 使用嵌套对象和键对阵列进行建模,ios,objective-c,arrays,json,dictionary,Ios,Objective C,Arrays,Json,Dictionary,我一直在四处寻找如何对下面的数组进行建模。我通过tide.tideSummary访问这个数组-我自己也尝试过用1级数据建模基本字典的例子,但它有嵌套数据。我在研究JSONModel,它看起来很棒,但我不认为它可以深入到嵌套字典中去 我知道如何抓取单个对象,比如说数据,并获得漂亮的——但我想显示几个片段,并试图通过以下方式显示它们:(我会在头文件中声明每个片段) self.date.pretty self.data.type等 你有什么想法?我认为循环遍历每一项并添加到一个新对象会有点过分,似乎要
tide.tideSummary
访问这个数组-我自己也尝试过用1级数据建模基本字典的例子,但它有嵌套数据。我在研究JSONModel,它看起来很棒,但我不认为它可以深入到嵌套字典中去
我知道如何抓取单个对象,比如说数据
,并获得漂亮的
——但我想显示几个片段,并试图通过以下方式显示它们:(我会在头文件中声明每个片段)
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"
}
},
........,
........,
这是我目前的解决方案: 想听听你的想法或建议吗?谢谢看看github。它使用方便,功能强大 更新:
#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
#导入
#进口
#进口
#布拉格符号
@接口GIDate:MTLModel
@属性(非原子,强)NSString*pretty;
@结束
@接口GIUtcDate:MTL模型
@属性(非原子,强)NSString*pretty;
@结束
@接口GIData:MTLModel
@属性(非原子,强)NSString*高度;
@属性(非原子,强)NSString*类型;
@结束
@接口GITide:MTLModel
@属性(非原子,强)GIDate*日期;
@性质(非原子,强)异氰酸酯*异氰酸酯;
@属性(非原子,强)GIData*数据;
@结束
@接口GITideSummary:MTLModel
@属性(非原子、强)NSArray*潮汐;
@结束
#pragma-mark-gi实现
@实现基态
+(NSDictionary*)JSONKeyPathsByPropertyKey{
return{“pretty”:“pretty”};
}
@结束
@实现GIUtcDate
+(NSDictionary*)JSONKeyPathsByPropertyKey{
return{“pretty”:“pretty”};
}
@结束
@实现GIData
+(NSDictionary*)JSONKeyPathsByPropertyKey{
返回@{@“高度”:@“高度”,
@“类型”:@“类型”};
}
@结束
@GITide的实现
+(NSDictionary*)JSONKeyPathsByPropertyKey{
返回日期:@“日期”,
@“联合王国”:@“联合王国”,
@“数据”:@“数据”};
}
+(NSValueTransformer*)日期转换器{
返回[MTLValueTransformer mtl_JSONDictionaryTransformerWithModelClass:[GIDate class]];
}
+(NSValueTransformer*)UTCDATEJS变压器{
返回[MTLValueTransformer mtl_JSONDICTIONARY Transformer WithModelClass:[GIUtcDate class]];
}
+(NSValueTransformer*)数据转换器{
返回[MTLValueTransformer mtl_JSONDictionaryTransformerWithModelClass:[GIData class]];
}
@结束
@实施情况摘要
+(NSDictionary*)JSONKeyPathsByPropertyKey{
返回{@“潮汐”:“潮汐摘要”};
}
+(NSValueTransformer*)TIDESJS变压器{
返回[MTLValueTransformer mtl_JSONArrayTransformerWithModelClass:[GITide class]];
}
@结束
SpecBegin(MantleTestClass)
它(@“应该从JSON初始化GITideSummary”^{
NSDictionary*值=
@{
@“潮汐摘要”:@[@{
@“日期”:@{
@“美丽”:“2013年12月19日太平洋标准时间上午11:58”
},
@“utcdate”:@{
@“美丽”:“2013年12月19日格林威治标准时间下午7:58”,
},
@“数据”:@{
@“高度”:“5.97英尺”,
@“类型”:@“高潮”
}
}]
};
n错误*错误=nil;
GITideSummary*summary=[MTLJSONAdapter modelOfClass:[GITideSummary类]
fromJSONDictionary:值
错误:&错误];
expect(summary.to.beKindOf([GITideSummary类]);
expect(summary.tides.count).to.equal(1);
GITide*tide=summary.tides[0];
expect(tide).to.beKindOf([GITide类]);
expect(tide.data).to.beKindOf([GIData类]);
预期(潮汐数据高度)等于(@“5.97英尺”);
});
SpecEnd
您可以使用(提取单元格所需的对象后):[eachTideSummary valueForKeyPath:@“data.height”]
@DanShelly谢谢,性能/最佳做法是这样做“可以接受”。我目前的解决方案是这样做的,我查看了这个和JSONModel。它是否能够处理具有多个对象的数组。它们几乎就是母公司的子模型?是的,你可以编写自己的变压器。例如:啊,该示例使用该数组中的1个对象。如果访问类似于我上面发布的数据集的嵌套数据集,这将如何工作?w8秒,我将尝试编写此代码,然后我将提交代码,现在就完成此操作!GI
前缀代表什么?
#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