2011-10-19 11 views
1

私のサーバーからJSON応答があります。 RestKitログから採取 データは、次のようになりますRestKit - オブジェクトマッピング!ここで何がうまくいかないのですか?

置き、PlaceinfoとLatestDBUpdate:

sourceObject: ( 
    { 
    place =   { 
     "place_id" = "3cc1e372-f9d9-11e0-aba9-9415ab1a8034"; 
     placeinfo =    { 
      latitude = "12.5846738815"; 
      longtitude = "55.6815948486"; 
      "place_id" = "3cc1e372-f9d9-11e0-aba9-9415ab1a8034"; 
     }; 
     timestamp = "2011-10-19 00:33:44"; 
    }; 
}, 
    { 
    place =   { 
     "place_id" = "b65e36e0-f9d9-11e0-aba9-9415ab1a8034"; 
     placeinfo =    { 
      latitude = "12.5720376968"; 
      longtitude = "55.6785774231"; 
      "place_id" = "b65e36e0-f9d9-11e0-aba9-9415ab1a8034"; 
     }; 
     timestamp = "2011-10-19 00:37:08"; 
    }; 
}, 
    { 
    Timestamps =   { 
     "latest_update" = "2011-10-18 17:12:09"; 
     uuid = "8c6fb842-f99b-11e0-aba9-9415ab1a8034"; 
    }; 
})and targetObject: (null) 

データは、3つのオブジェクトにマッピングされます。

問題がある:

上記JSON応答の2位オブジェクトと多くの関係する一つに接続された2つのネストPlaceInfoオブジェクトが存在します。

Timestampsキーワードに関連するLatestDBUpdateオブジェクトもあります。

Restkitは3つのプレイスオブジェクトをマップし、1つはすべてNULLになります。 他の2つのプレイスオブジェクトは正しくマップされており、リレーションも正しいです。 もちろん、2つのオブジェクトをマップするだけです!

LatestDBUpdateマッピングは、正しいタイムスタンプもマッピングします。

私は、JSONの応答のタイムスタンプ部分を削除すると、2つの場所オブジェクトだけでマッピングが正しいことを確認しました。

しかし、私はそこにタイムスタンプの部分が必要です! これを修正する方法がわかりません!任意のアイデア - 私は実際にいくつかの入力を使用することができます。

ここ

が使用されるマッピングの設定です:

//Place mapping 
if (!self.placeManagedObject){ 
    self.placeManagedObject = [RKManagedObjectMapping mappingForClass:[Place class]]; 
    self.placeManagedObject.primaryKeyAttribute = @"UUID"; 
    self.placeManagedObject.setDefaultValueForMissingAttributes = YES; 
    [self.placeManagedObject mapKeyPath:@"place_id" toAttribute:@"UUID"]; 
    [self.placeManagedObject mapKeyPath:@"timestamp" toAttribute:@"timestamp"]; 
} 
//PlaceInformation mapping 
if (!self.placeInfoManagedObject){ 
    self.placeInfoManagedObject = [RKManagedObjectMapping mappingForClass:[PlaceInfo class]]; 
    self.placeInfoManagedObject.primaryKeyAttribute = @"UUID";self.placeInfoManagedObject.setDefaultValueForMissingAttributes = YES; 
    [placeInfoManagedObject mapKeyPath:@"place_id" toAttribute:@"UUID"]; 
    [placeInfoManagedObject mapKeyPath:@"longtitude" toAttribute:@"longtitude"]; 
    [placeInfoManagedObject mapKeyPath:@"latitude" toAttribute:@"latitude"]; 
} 
//latestDBUpdate timestamp mapping 
if (!self.latestDBUpdateManagedObject){ 
    self.latestDBUpdateManagedObject = [RKManagedObjectMapping mappingForClass:[LatestDBUpdate class]]; 
    self.latestDBUpdateManagedObject.primaryKeyAttribute = @"latest_update"; 
    [self.latestDBUpdateManagedObject mapKeyPath:@"latest_update"toAttribute:@"latest_update"]; 
    [self.latestDBUpdateManagedObject mapKeyPath:@"uuid" toAttribute:@"uuid"]; 
} 
//Set mapping relations 
[self.placeManagedObject mapRelationship:@"placeinfo" withMapping:self.placeInfoManagedObject]; 
// Register mapping with the provider - 
[self.objectManager.mappingProvider setMapping:self.placeManagedObject forKeyPath:@"place"]; 
[self.objectManager.mappingProvider setMapping:self.placeInfoManagedObject forKeyPath:@"placeinfo"]; 
[self.objectManager.mappingProvider setMapping:self.latestDBUpdateManagedObject forKeyPath:@"Timestamps"]; 

答えて

1

再び、私自身の問題に答えを... Restkitを使用し、ここで多くのメンバーが存在しないようです!

多分かなり、しかし は、JSON応答のタイムスタンプの一部を除去することなく、働いているだけでなく、私の解決策、:

私は次のようにJSONレスポンスを修正:

{ 
placeList =  ( 
      { 
     place =    { 
      "place_id" = "3cc1e372-f9d9-11e0-aba9-9415ab1a8034"; 
      placeinfo =     { 
       latitude = "12.5846738815"; 
       longtitude = "55.6815948486"; 
       "place_id" = "3cc1e372-f9d9-11e0-aba9-9415ab1a8034"; 
      }; 
      timestamp = "2011-10-19 00:33:44"; 
     }; 
    }, 
      { 
     place =    { 
      "place_id" = "b65e36e0-f9d9-11e0-aba9-9415ab1a8034"; 
      placeinfo =     { 
       latitude = "12.5720376968"; 
       longtitude = "55.6785774231"; 
       "place_id" = "b65e36e0-f9d9-11e0-aba9-9415ab1a8034"; 
      }; 
      timestamp = "2011-10-19 00:37:08"; 
     }; 
    } 
); 
updateData =  { 
    timestamps =   { 
     "latest_update" = "2011-10-18 17:12:09"; 
     uuid = "8c6fb842-f99b-11e0-aba9-9415ab1a8034"; 
    }; 
};} 

を追加places - > placeListおよびupdateData for timestampsの一種の主キー。

私はまた、JSON入力への変更を反映するために、プロバイダのためのキーパスを変更するために必要な:

// Register mapping with the provider - 
[self.objectManager.mappingProvider setMapping:self.placeManagedObject forKeyPath:@"placeList.place"]; 
[self.objectManager.mappingProvider setMapping:self.placeInfoManagedObject forKeyPath:@"placeinfo"]; 
[self.objectManager.mappingProvider setMapping:self.latestDBUpdateManagedObject forKeyPath:@"updateData.timestamps"]; 

は、だから、それを解決しました。もはやヌルオブジェクト、マッピングされていない、あなたdo notは かなりJSONへの変更がそのように大きな理由を理解する マッピングの違い!

0

まず、このような質問をするときに有効なJSONを投稿すると、より多くの回答が得られるはずです。

第2に、TimestampsオブジェクトをsourceObject配列の一部としてグループ化することです。代わりに、次のようにして、あなたが望むものを得た可能性があります。

{ 
    "sourceObject": [ 
     { 
      "place": { 
       "place_id": "3cc1e372-f9d9-11e0-aba9-9415ab1a8034", 
       "placeinfo": { 
        "latitude": "12.5846738815", 
        "longtitude": "55.6815948486", 
        "place_id": "3cc1e372-f9d9-11e0-aba9-9415ab1a8034" 
       }, 
       "timestamp": "2011-10-19 00:33:44" 
      } 
     }, 
     { 
      "place": { 
       "place_id": "b65e36e0-f9d9-11e0-aba9-9415ab1a8034", 
       "placeinfo": { 
        "latitude": "12.5720376968", 
        "longtitude": "55.6785774231", 
        "place_id": "b65e36e0-f9d9-11e0-aba9-9415ab1a8034" 
       }, 
       "timestamp": "2011-10-19 00:37:08" 
      } 
     } 
    ], 
    "Timestamps": { 
     "latest_update": "2011-10-18 17:12:09", 
     "uuid": "8c6fb842-f99b-11e0-aba9-9415ab1a8034" 
    } 
} 
関連する問題