84

Jacksonを使用してDynamoDBにデータを保存し、複雑なオブジェクトを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>これはジャクソンの標準的な動作であり、これが起こっているのは間違いではありません。

だから今、これは問題につながります。私のコードベースは、それがを処理していると考えています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」にキャストできないことを示すランタイムエラーが発生します。

4

3 に答える 3

204

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として実際にシリアル化することは避け、代わりにメモリ内のイベントシーケンスを中間ステップとして使用します。

于 2013-03-16T18:42:12.503 に答える
8

値のリストを含むGenericResponseオブジェクトがある場合にも同様の問題が発生しました

 ResponseEntity<ResponseDTO> responseEntity = restTemplate.exchange(
                redisMatchedDriverUrl,
                HttpMethod.POST,
                requestEntity,
                ResponseDTO.class
        );

objectMapperの使用は、LinkedHashMapをそれぞれのDTOオブジェクトに変換するのに役立ちました

 ObjectMapper mapper = new ObjectMapper();

 List<DriverLocationDTO> driverlocationsList = mapper.convertValue(responseDTO.getData(), new TypeReference<List<DriverLocationDTO>>() { });
于 2019-07-16T20:41:19.573 に答える
0

この問題には良い解決策があります:

import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper objectMapper = new ObjectMapper();

***DTO premierDriverInfoDTO = objectMapper.convertValue(jsonString, ***DTO.class); 

Map<String, String> map = objectMapper.convertValue(jsonString, Map.class);

なぜこの問題が発生したのですか?文字列をオブジェクトに変換するときに特定の型を指定しなかったと思います。オブジェクトは、User<T>などのジェネリック型のクラスです。

ObjectMapperの代わりにGsonを使用して、それを解決する別の方法があるかもしれません。(または、ここでGSONを使用したジェネリック型の逆シリアル化を参照してください)

Gson gson = new GsonBuilder().create();

Type type = new TypeToken<BaseResponseDTO<List<PaymentSummaryDTO>>>(){}.getType();

BaseResponseDTO<List<PaymentSummaryDTO>> results = gson.fromJson(jsonString, type);

BigDecimal revenue = results.getResult().get(0).getRevenue();
于 2019-03-20T09:15:10.460 に答える