2011-10-19 66 views
1

我有我的服務器的JSON響應。 的數據,從RestKit日誌採取看起來像這樣:RestKit - Objectmapping!這裏出了什麼問題?

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個對象:

廣場,Placeinfo和LatestDBUpdate。

的問題是:

在上述JSON響應有2分地方的對象和2個嵌套PlaceInfo對象,具有一個連接到一對多的關係。

還有一個涉及Timestamps關鍵字的LatestDBUpdate對象。

Restkit將映射3個Place對象,其中一個將全爲NULL。 其他2個Place對象映射正確,關係也正確。 它當然只應該映射2個Place對象!

LatestDBUpdate映射也映射時間戳正確。

我已經確定,如果我刪除了JSON響應的Timestamps部分,那麼映射是正確的,只有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"; 
    }; 
};} 

添加一種地方的主鍵 - > placeList和updateData的時間戳。

我還需要改變的keyPath的供應商,以反映變化的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"]; 

所以解決它。沒有更多的NULL對象,映射,即使你我不 很明白爲什麼改變到JSON使得這樣一個大的 映射的區別。

0

首先,如果您在提問這樣​​的問題時發佈有效的JSON會更有幫助 - 您可能會收到更多回復。

其次,第一次嘗試的主要問題是將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" 
    } 
}