【问题标题】: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 谢谢,性能/最佳实践是“可以接受的”。我目前的解决方案就是这样做。

标签: ios objective-c arrays json dictionary


【解决方案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 前缀代表什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 2019-10-06
  • 2018-05-20
  • 1970-01-01
  • 2015-10-18
  • 2019-10-09
  • 1970-01-01
相关资源
最近更新 更多