반응형
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)
있습니까?
문제는 잭슨에서 나왔습니다. 역 직렬화 할 클래스에 대한 정보가 충분하지 않으면 LinkedHashMap
.
당신이 당신의 요소 유형의 잭슨을 통보하지 않을 때문에 ArrayList
, 그것은 당신이로 직렬화하는 것을 모르는 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
. 이것이 내가하고 일한 것입니다 .
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)
두 번째 줄에 오류가 발생하면 One 사용할 수 있습니다.
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 >>(){ });
반응형
'development' 카테고리의 다른 글
"find"명령 결과를 Bash에 배열로 저장하려면 어떻게해야합니까? (0) | 2020.12.11 |
---|---|
word2vec bin 파일을 텍스트로 변환 (0) | 2020.12.11 |
Microsoft Edge의 사용자 에이전트 문자열 이름은 무엇입니까? (0) | 2020.12.11 |
Swift에서 환경 변수 참조 (0) | 2020.12.11 |
java.lang.NoSuchMethodError : 정적 메소드 없음 getFont (Landroid / content / Context; ILandroid / util / TypedValue; ILandroid / widget / TextView;) (0) | 2020.12.11 |