-2

私が制御できない JSON を読み取れるようにする必要があります。基本的に、JSON は次のようになります。

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

RestKit で解析しようとしていますが、オブジェクト階層の最初の 2 つのレベルを処理する方法がわかりませんでした。問題の項目はより複雑ですが、ここでは問題ではありません。問題は、経験的に毎回アイテムが 1 つしかないように見える 2 番目の配列をスキップする方法です。

要するに、これを平坦化し、配列の配列ではなく単一の配列を取得したいと思います。

のマッピングを作成しようとしました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 での私の経験から、これは 1 つのマッピングでのみ機能します。@"" をルート キーパスとして使用すると、それを機能させることができるはずです。ただし、アプリケーション全体で RestKit を使用する場合は、応答データを変更してルート要素名を含める必要があります。

于 2013-08-12T20:32:17.677 に答える