1

JSON結果をObjective-CオブジェクトにマップするためにRestkitバージョン0.2を使用しています。受け取った JSON は次のようになります。

{
"result": {
    "errorCode": 0,
    "errorMsg": "ok",
    "data": {
        "orderitems": [
            {
                "id": "46",
                "o_order_id": "15",
                "p_product_id": "7",
                "t_event_id": "1",
                "quantity": "1",
                "price": "4.5",
                "name": "Name1",
                "unit": "something1",
                "image": "images/7.png"
            },
            {
                "id": "47",
                "o_order_id": "15",
                "p_product_id": "10",
                "t_event_id": "1",
                "quantity": "1",
                "price": "3.99",
                "name": "Name2",
                "unit": "something2",
                "image": "images/10.png"
            }
        ]
    }
}
}

次のマッピングを定義しました。

RKObjectMapping *oiMapping = [RKObjectMapping mappingForClass:[OrderItem class]];
[oiMapping mapKeyPathsToAttributes:@"p_product_id", @"productID", @"name", @"name",  @"t_event_id", @"eventID",  @"quantity", @"quantity",  nil];
[objectManager.mappingProvider setMapping:oiMapping forKeyPath:@"result.data.orderitems"];

RKObjectMapping *takeOrderResultMapping = [RKObjectMapping mappingForClass:[TakeOrderResult class]];
[takeOrderResultMapping mapKeyPathsToAttributes:@"errorCode", @"errorCode", @"errorMsg", @"errorMessage", nil];
[takeOrderResultMapping mapRelationship:@"orderitems" withMapping:oiMapping];

[objectManager.mappingProvider setMapping:takeOrderResultMapping forKeyPath:@"result"];
takeOrderResultMapping.rootKeyPath = @"result";
[[RKObjectManager sharedManager].mappingProvider setErrorMapping:takeOrderResultMapping]; 

最後に、TakeOrderResult クラスは次のように定義されます。

@interface TakeOrderResult : NSObject
@property (strong, nonatomic) NSNumber *errorCode;
@property (strong, nonatomic) NSString *errorMessage;
@property (strong, nonatomic) NSSet *orderitems;
@end

これは多かれ少なかれ機能しますが、Restkit が返すのは 3 つのオブジェクトの配列です。最初のオブジェクトは、空のセット「orderitems」を持つ TakeOrderResult のインスタンスです。次の 2 つのオブジェクトは、OrderItems のインスタンスです。

誰かが私を助けて、1 つのオブジェクト、つまり「orderitems」が 2 つのオブジェクト / 2 つの OrderItems のセットである TakeOrderResult のインスタンスを取得しない理由を指摘できれば素晴らしいことです。

4

1 に答える 1

1

マッピングが少しずれています。3 つのオブジェクトを取得する理由は、両方のマッピングをマッピング プロバイダーに追加しているためです。「orderitems」が空のセットである理由は、orderitems を見つける方法がわからないためです。

うまくいくかどうかはわかりませんが、次のことを試してみてください。oiMapping をマッピング プロバイダーに追加しないでください。そして代わりに:

[takeOrderResultMapping mapRelationship:@"orderitems" withMapping:oiMapping];

試す:

[takeOrderResultMapping addRelationshipMappingWithSourceKeyPath:@"data.orderitems" mapping:oiMapping];

于 2013-01-07T08:46:52.100 に答える