以下のエラーが発生しています:
Java.lang.ClassCastException: Java.util.LinkedHashMap cannot be cast to com.testing.models.Account
以下のコードで
final int expectedId = 1;
Test newTest = create();
int expectedResponseCode = Response.SC_OK;
ArrayList<Account> account = given().when().expect().statusCode(expectedResponseCode)
.get("accounts/" + newTest.id() + "/users")
.as(ArrayList.class);
assertThat(account.get(0).getId()).isEqualTo(expectedId);
get(0)
できない理由はありますか?
問題はジャクソンから来ています。どのクラスにデシリアライズするかに関する十分な情報がない場合、LinkedHashMap
を使用します。
ArrayList
の要素タイプをJacksonに通知していないため、ArrayList
のAccount
にデシリアライズすることを知りません。そのため、デフォルトにフォールバックします。
代わりに、おそらくas(JsonNode.class)
を使用してから、ObjectMapper
を安心して使用できる方法よりも豊富な方法で処理できます。このようなもの:
ObjectMapper mapper = new ObjectMapper();
JsonNode accounts = given().when().expect().statusCode(expectedResponseCode)
.get("accounts/" + newClub.getOwner().getCustId() + "/clubs")
.as(JsonNode.class);
//Jackson's use of generics here are completely unsafe, but that's another issue
List<Account> accountList = mapper.convertValue(
accounts,
new TypeReference<List<Account>>(){}
);
assertThat(accountList.get(0).getId()).isEqualTo(expectedId);
以下を試してください:
POJO pojo = mapper.convertValue(singleObject, POJO.class);
または:
List<POJO> pojos = mapper.convertValue(
listOfObjects,
new TypeReference<List<POJO>>() { });
詳細については、 LinkedHashMapの変換 を参照してください。
LinkedHashMapオブジェクトのコレクションに対するJSON配列問題を軽減する方法は、CollectionType
ではなくTypeReference
を使用することでした。これは私がやったことであり、worked:
public <T> List<T> jsonArrayToObjectList(String json, Class<T> tClass) throws IOException {
ObjectMapper mapper = new ObjectMapper();
CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, tClass);
List<T> ts = mapper.readValue(json, listType);
LOGGER.debug("class name: {}", ts.get(0).getClass().getName());
return ts;
}
TypeReference
を使用して、LinkedHashMapsのArrayListを取得していました。つまり、動作しません:
public <T> List<T> jsonArrayToObjectList(String json, Class<T> tClass) throws IOException {
ObjectMapper mapper = new ObjectMapper();
List<T> ts = mapper.readValue(json, new TypeReference<List<T>>(){});
LOGGER.debug("class name: {}", ts.get(0).getClass().getName());
return ts;
}
私は同様の例外がありましたが(異なる問題)-Java.lang.ClassCastException: Java.util.LinkedHashMap cannot be cast to org.bson.Document
、そして幸いにも簡単に解決されました:
の代わりに
List<Document> docs = obj.get("documents");
Document doc = docs.get(0)
2行目にエラーが発生します。
List<Document> docs = obj.get("documents");
Document doc = new Document(docs.get(0));
XMLを逆シリアル化し、型を変換するこのメソッドがあります。
public <T> Object deserialize(String xml, Class objClass ,TypeReference<T> typeReference ) throws IOException {
XmlMapper xmlMapper = new XmlMapper();
Object obj = xmlMapper.readValue(xml,objClass);
return xmlMapper.convertValue(obj,typeReference );
}
そして、これは呼び出しです:
List<POJO> pojos = (List<POJO>) MyUtilClass.deserialize(xml, ArrayList.class,new TypeReference< List< POJO >>(){ });