-2

我需要能够读取一些我无法控制的 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

4 回答 4

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提到的块

- (void)setWillMapDeserializedResponseBlock:(id ( ^ ) ( id deserializedResponseBody ))block

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

于 2013-08-12T20:29:07.297 回答
0

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

于 2013-08-12T20:32:17.677 回答
0

您不能将内部数组的单个元素复制到另一个数组吗?

NSMutableArray *newArr = [NSMutableArray new];
for (NSArray *innerArr in jsonObject)
    [newArr addObject:innerArr[0]];
于 2013-08-11T19:45:33.487 回答
0

您没有说要映射到什么,将基本字典映射到自定义对象会有些困难。如果您创建具有数组属性的对象:

@property (strong, nonatomic) NSArray *items;

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

于 2013-08-11T21:07:29.007 回答