使用RestKit处理未命名的数组

时间:2013-08-11 19:41:34

标签: objective-c json restkit

我需要能够阅读一些我无法控制的JSON。基本上JSON看起来像这样:

[ [{"a":1,"b":2}], [{"a":1,"b":2}], [{"a":1,"b":2}] ]

我正在尝试使用RestKit解析它,我无法弄清楚如何处理对象层次结构的前两个级别。有问题的项目比较复杂,但这里不是问题。问题是我应该如何跳过第二个经验似乎每次只有一个项目的数组。

简而言之,我想把它弄平并获得单个数组而不是数组数组。

我试图为NSArray创建一个映射,但是从那里我不知道如何映射这个数组中的项目。内部数组没有名称,我无法弄清楚如何在映射中引用它。

非常感谢任何有效的解决方案。

更新

这里的问题是我应该如何创建JSON映射而不是如何读取多维数组。我尝试了以下但我不知道NSArray的映射是否正常。以下映射给出了一个示例,但它不起作用:

secondMapping = [RKObjectMapping mappingForClass:[MyClass class]];
[secondMapping addAttributeMappingsFromDictionary:@{
 @"a": @"a",
 @"b": @"b"
 }];

firstMapping = [RKObjectMapping mappingForClass:[NSArray class]];
[firstMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:nil
                                                                              toKeyPath:nil
                                                                             withMapping:secondMapping]];

4 个答案:

答案 0 :(得分:0)

难道你不能只将内部数组的单个元素复制到另一个数组吗?

NSMutableArray *newArr = [NSMutableArray new];
for (NSArray *innerArr in jsonObject)
    [newArr addObject:innerArr[0]];

答案 1 :(得分:0)

您没有说要映射到的内容,将基本字典映射到自定义对象会有点困难。如果使用数组属性创建对象:

@property (strong, nonatomic) NSArray *items;

然后,您可以映射items数组将包含NSDictionary个实例的这些对象的数组。这将使用nil密钥路径映射到items密钥。

答案 2 :(得分:0)

在不放弃RestKit的情况下完成此工作的最佳方法是添加自定义JSON序列化程序。我只需要secondMapping和那里的映射来匹配对象层次结构。

[RKMIMETypeSerialization registerClass:[MySerialization class] forMIMEType:@"application/json"];

这是我的序列化器:

@implementation MySerialization

+ (id)objectFromData:(NSData *)data error:(NSError **)error
{
    id object = [NSJSONSerialization JSONObjectWithData:data options:0 error:error];
    // Fix the following weirdness in JSON response:
    // [ [{route_1}], ..., [{route_n}] ]
    if ([object isKindOfClass:[NSArray class]]
        && [[object lastObject] isKindOfClass:[NSArray class]])
    {
        object = [object valueForKeyPath:@"@unionOfArrays.@self"];
    }
    return object;
}

+ (NSData *)dataFromObject:(id)object error:(NSError **)error
{
    return [NSJSONSerialization dataWithJSONObject:object options:0 error:error];
}

@end

其他替代方法是RKResponseMapperOperation提到here

中的阻止
- (void)setWillMapDeserializedResponseBlock:(id ( ^ ) ( id deserializedResponseBody ))block

我选择了自定义序列化程序,因为它更简单,但这绝对是更具扩展性的方式。

答案 3 :(得分:0)

根据我使用RestKit的经验,这只适用于一个映射。使用@“”作为根密钥路径,您应该能够使其工作。但是,如果您打算在整个应用程序中使用RestKit,则可能需要修改响应数据以包含根元素名称。