我需要能够阅读一些我无法控制的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]];
答案 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,则可能需要修改响应数据以包含根元素名称。