Restkit使用Forsquare映射嵌套数组

Exi*_*ing 4 iphone objective-c foursquare ios restkit

我正在尝试研究如何使用restKit从foursquare获取一些数据.

我正在使用本教程.

使用此代码

我尝试做一些不同的,所以我尝试从类别中获取数据.

这是foursqure的json看起来像

   {
  venue: {
    id: "40a55d80f964a52020f31ee3",
    name: "Clinton St. Baking Co. & Restaurant",
    contact: {
      phone: "6466026263",
      formattedPhone: "(646) 602-6263"
    },
    location: {
      address: "4 Clinton St",
      crossStreet: "at E Houston St.",
      lat: 40.721294,
      lng: -73.983994,
      postalCode: "10002",
      city: "New York",
      state: "NY",
      country: "United States",
      cc: "US"
    },
    canonicalUrl: "https://foursquare.com/v/clinton-st-baking-co--restaurant/40a55d80f964a52020f31ee3",
    categories: [
      {
        id: "4bf58dd8d48988d143941735",
        name: "Breakfast Spot",
        pluralName: "Breakfast Spots",
        shortName: "Breakfast / Brunch",
        icon: {
          prefix: "https://foursquare.com/img/categories_v2/food/breakfast_",
          suffix: ".png"
        },
        primary: true
      },
      {
        id: "4bf58dd8d48988d16a941735",
        name: "Bakery",
        pluralName: "Bakeries",
        shortName: "Bakery",
        icon: {
          prefix: "https://foursquare.com/img/categories_v2/food/bakery_",
          suffix: ".png"
        }
      },
      {
        id: "4bf58dd8d48988d16d941735",
        name: "Café",
        pluralName: "Cafés",
        shortName: "Café",
        icon: {
          prefix: "https://foursquare.com/img/categories_v2/food/cafe_",
          suffix: ".png"
        }
      }
    ],

  }
}
Run Code Online (Sandbox Code Playgroud)

这是获取统计数据的教程的一部分

@interface Venue : NSObject

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) Stats *stats;


@interface Stats : NSObject

@property (nonatomic, strong) NSNumber *checkinsCount;
@property (nonatomic, strong) NSNumber *tipCount;
@property (nonatomic, strong) NSNumber *usersCount;
Run Code Online (Sandbox Code Playgroud)

映射部分

RKObjectMapping *statsMapping = [RKObjectMapping mappingForClass:[Stats class]];
    [statsMapping addAttributeMappingsFromArray:@[@"checkinsCount", @"tipCount", @"usersCount"]];
    RKRelationshipMapping *statsRelation = [RKRelationshipMapping relationshipMappingFromKeyPath:@"stats" toKeyPath:@"stats" withMapping:statsMapping];
    [venueMapping addPropertyMapping:statsRelation];
Run Code Online (Sandbox Code Playgroud)

映射后.

我可以轻松获得如下数据

NSLog(@"%i",venue.stats.checkinsCount);
Run Code Online (Sandbox Code Playgroud)

它将打印checkinsCount编号

现在我尝试获取类别数据.我修复了代码以获取新数据.

添加这样的东西

@interface Venue : NSObject

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) Categories *categories;

@interface Categories : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic ,strong) NSString *pluralName;
Run Code Online (Sandbox Code Playgroud)

像这样添加映射

RKObjectMapping *categoriesMapping = [RKObjectMapping mappingForClass:[Categories class]];
    [categoriesMapping addAttributeMappingsFromDictionary:@{@"name":@"name",@"pluralName":@"pluralName"}];
    RKRelationshipMapping *cate = [RKRelationshipMapping relationshipMappingFromKeyPath:@"categories" toKeyPath:@"categories" withMapping:categoriesMapping];
    [venueMapping addPropertyMapping:cate];
Run Code Online (Sandbox Code Playgroud)

现在我尝试获取类别名称

NSLog(@"%@",venue.categories.pluralName);
Run Code Online (Sandbox Code Playgroud)

但它总是为空

我想也许是数据类型的问题?

有三个名字,我不知道如何打印出所有这些名称.

对不起,我的母语不是英语,所以我无法很好地解释这种情况.

Wai*_*ain 8

在JSON中,categories是一个数组,因此您尝试将其映射到的属性应为:

@property (strong, nonatomic) NSArray *categories;
Run Code Online (Sandbox Code Playgroud)

您记录代码然后需要更改以迭代类别:

for (Categories *category in venue.categories) {
    NSLog(@"%@", category.pluralName);
}
Run Code Online (Sandbox Code Playgroud)

类Category具有误导性的名称,因为它实际上不是一个集合对象(正如您最初想要的那样).