Java自定义Character记录JSON反序列化报错求助
问题解决:JSON反序列化自定义Character Record失败
问题根源
异常信息明确提示Cannot deserialize value of type java.lang.Character from Object value,核心原因是你的自定义record类名Character和Java核心库的java.lang.Character(单个字符类型)重名。Jackson解析时误将目标类型识别为JDK自带的单个字符类,而该类只能接收单个字符值,无法匹配API返回的JSON对象结构,因此抛出反序列化异常。
解决方案
方案1:重命名自定义Record类(推荐)
直接修改自定义record的类名,避免与JDK核心类冲突,例如改成WizardCharacter:
import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) public record WizardCharacter( @JsonAlias("fullName") String name, @JsonAlias("hogwartsHouse") String house, @JsonAlias("birthdate") String birthdate, @JsonAlias("index") Integer characterID) { }
同步修改反序列化代码中的类型:
try { WizardCharacter harry = mapper.readValue(json.toString(), WizardCharacter.class); System.out.println(harry.toString()); } catch (JsonProcessingException e) { throw new RuntimeException(e); }
方案2:使用全限定类名指定目标类型
若不想修改类名,在调用readValue时明确指定自定义类的全限定路径(替换为你项目实际的包名):
try { Character harry = mapper.readValue(json.toString(), dev.alexcastellanos.potterapi.Character.class); System.out.println(harry.toString()); } catch (JsonProcessingException e) { throw new RuntimeException(e); }
此方式可让Jackson准确识别你自定义的Record类,而非JDK自带的java.lang.Character。
额外验证点
确保你的ObjectMapper版本支持Java Record(Jackson 2.12+默认支持,旧版本需添加jackson-modules-java8依赖并启用相关模块)。
内容的提问来源于stack exchange,提问作者Alejandro Castellanos
相关产品推荐
相关产品推荐

