Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用嵌套对象和键对阵列进行建模_Ios_Objective C_Arrays_Json_Dictionary - Fatal编程技术网

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