Java 직렬화 대신 Jackson을 일반 직렬화 엔진으로 사용하려고합니다. 다음과 같은 방법으로 매퍼를 초기화합니다.
objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
모든 유형 정보는 JSON에 저장되므로 다음을 사용하여 모든 객체를 다시 쓰고 읽을 수 있습니다.
objectMapper.readValue(json, Object.class)
Java 배열을 직렬화 한 다음 역 직렬화하려고 할 때 문제가 있습니다. Jackson은 배열 유형을 JSON에 저장하지 않기 때문에 나중에 deserialization 단계에서 실패합니다. 다음 코드에서 :
String [] strings = {"A", "B", "C"};
try {
String json = objectMapper.writeValueAsString(strings);
String [] stringsBack = (String [])objectMapper.readValue(json, Object.class);
if (!strings.equals(stringsBack)) {
System.err.println("ERROR, stringsBack not the same!!!\n\n");
}
} catch (IOException e) {
e.printStackTrace();
}
json은 "["A ","B ","C "]"로 설정되지만 deserialization시 다음 예외가 발생합니다.
Exception in thread "main" java.lang.IllegalArgumentException: Invalid type id 'A' (for id type 'Id.class'): no such class found
at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:66)
at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:48)
at com.fasterxml.jackson.databind.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:157)
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:94)
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromAny(AsArrayTypeDeserializer.java:68)
at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserializeWithType(UntypedObjectDeserializer.java:494)
at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:42)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3560)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2576)
at Main.run(Main.java:86)
Jackson에게 Java 배열 유형 정보를 JSON에 저장하도록 지시하는 방법이 있습니까? 내 직렬화 엔진은 일반적이며 JSON 문자열에서 읽을 유형을 미리 알지 못합니다.
지금까지 찾은 최고의 솔루션은 직렬화 전에 객체가 배열 (Class.isArray)인지 확인한 다음 직렬화를 수행하는 것입니다.
TypeReference ref = new TypeReference<List[]>() { };
String json = objectMapper.writerFor(ref).writeValueAsString(strings);
그러면 배열 유형이 JSON에 추가되고 다시 읽을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다