1. ホーム
  2. java

[解決済み] LinkedHashMapから複合オブジェクトへのキャスト

2023-06-16 05:47:19

質問

DynamoDBにデータを保存するアプリケーションを持っていますが、Jacksonを使用して複雑なオブジェクトをJSONにマーシャルしています。

例えば、私がマーシャルしているオブジェクトは次のようなものです。

private String aString;
private List<SomeObject> someObjectList;

ここで、SomeObjectは以下のような感じでしょうか。

private int anInteger;
private SomeOtherObject;

とSomeOtherObjectはこのような感じになるかもしれません。

private long aLong;
private float aFloat; 

これは、オブジェクトが問題なくマーシャルされ、JSON文字列としてDBに格納されることを意味します。

DynamoDBからデータを取得するとき、Jacksonは自動的にJSONを取得し、それを変換して返します... ただし、'someObjectList' は List<LinkedHashMap> としてではなく List<SomeObject> ! これは Jackson の標準的な動作であり、このようなことが起こるのは間違いではありません。

さて、これで問題が発生しました。私のコードベースでは List<SomeObject> を処理していると思っていますが、実際には List<LinkedHashMap> ! 私の質問は、LinkedHashMapを'SomeObject'に戻すにはどうしたらいいかということです。明らかにこれは手動プロセスですが、私が言いたいのは、私は値を抽出することさえできないということです。

もし私がこうすれば

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

someObjectListはLinkedHashMapではなく 'SomeObject' 型であるというコンパイルエラーが発生しました。

このようにすると

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

LinkedHashMapは'SomeObject'にキャストできないというランタイムエラーが発生します。

どのように解決するのですか?

この場合 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として実際にデータをシリアライズすることを避け、代わりに中間段階としてメモリ内のイベントシーケンスを使用します。