2013-03-15 6 views
23

Jacksonを使用して、複合オブジェクトをJSONに整列するために、DynamoDBにデータを格納するアプリケーションがあります。LinkedHashMapを複合オブジェクトにキャストする

たとえば私は、マーシャリングてるオブジェクトは次のようになります。

private int anInteger; 
private SomeOtherObject; 

とSomeOtherObjectは次のようになります:

private long aLong; 
private float aFloat; 
SomeObjectのは、次のようになります

private String aString; 
private List<SomeObject> someObjectList; 

これは問題なくマーシャリングされ、JSON文字列としてDBに格納されます。

DynamoDBからデータを取得するタイミングが来ると、自動的にJSONが取得され、それを元に戻します。「someObjectList」はList<SomeObject>ではないList<LinkedHashMap>として返されます。これは、ジャクソンの標準的な動作であり、間違いではありません。

これで問題が発生しました。私のコードベースは、List<SomeObject>を扱っていると思っていますが、現実はそのハンドリングがList<LinkedHashMap>です!私の質問は、私のLinkedHashMapを「SomeObject」に戻す方法です。明らかにこれは手動のプロセスですが、私が意味することは、値を抽出することすらできないということです。

私はこれを行う場合:

for (LinkedHashMap lhm : someObjectList) { 
    // Convert the values back 
} 

を私はコンパイルエラーがないのLinkedHashMap「SomeObjectの」someObjectListのタイプがあることを私に言ってもらいます。

私はこれを行う場合:

for (SomeObject lhm : someObjectList) { 
    // Convert the values back 
} 

を私はのLinkedHashMapが「SomeObjectの」にキャストできないことを私に言って、ランタイムエラーが発生します。

答えて

70

ObjectMapper.convertValue()は、値でも、リスト全体でも使用できます。これは、あなたがやったかのように機能的に同じである

POJO pojo = mapper.convertValue(singleObject, POJO.class); 
// or: 
List<POJO> pojos = mapper.convertValue(listOfObjects, new TypeReference<List<POJO>>() { }); 

byte[] json = mapper.writeValueAsBytes(singleObject); 
POJO pojo = mapper.readValue(json, POJO.class); 

ではなく、メモリ内のイベントを使用して、JSONなどのデータの実際のシリアル化を避けるしかし、あなたはに変換するタイプを知っておく必要がありますシーケンスを中間ステップとして使用します。

+0

ただし、2番目の例ではPOJO型への静的参照は必要ありません。 –

+0

@ BoSborgPetersen私はあなたがそのことをどういう意味かはっきりしていません... – StaxMan

+0

恐ろしいです。私がしなければならないのは、POJOクラスにデフォルトのコンストラクタが含まれていることを確認することです(他のパラメータ化されたコンストラクタが存在する場合) – Gnana

関連する問題