web-dev-qa-db-ja.com

java.lang.ClassCastException:Java.util.LinkedHashMapをcom.testing.models.Accountにキャストできません

以下のエラーが発生しています:

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)できない理由はありますか?

57

問題はジャクソンから来ています。どのクラスにデシリアライズするかに関する十分な情報がない場合、LinkedHashMapを使用します。

ArrayListの要素タイプをJacksonに通知していないため、ArrayListAccountにデシリアライズすることを知りません。そのため、デフォルトにフォールバックします。

代わりに、おそらく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);
68
Mark Peters

以下を試してください:

POJO pojo = mapper.convertValue(singleObject, POJO.class);

または:

List<POJO> pojos = mapper.convertValue(
    listOfObjects,
    new TypeReference<List<POJO>>() { });

詳細については、 LinkedHashMapの変換 を参照してください。

25
user2578871

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;
}
18
Himadri Pant

私は同様の例外がありましたが(異なる問題)-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));
4
nurb

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 >>(){ });
0