Jackson将字符串转Java对象报UnrecognizedPropertyException怎么解决
异常原因分析
1. 转义处理逻辑错误
你代码中String sample = content.replaceAll("\\\\", " ");的逻辑完全不符合预期:
Sample.txt存储的是带转义符的JSON串,\"表示转义双引号,你把反斜杠替换为空格后,原内容\"Code\"会变成"Code ",JSON键名末尾多了空格,和POJO字段完全无法匹配,异常信息里提示的Unrecognized field "Code "末尾带空格就是直接证据。
2. Jackson默认字段映射规则不匹配
Jackson默认遵循JavaBean命名规范,会自动将POJO字段首字母转为小写后匹配JSON键:
你POJO中定义的private String Code;会被Jackson识别为code,但JSON中的键是大写开头的Code,两者无法对应。
解决方案
第一步:修复转义处理逻辑
首先把转义处理的代码修改为删除反斜杠,而不是替换为空格:
// 删掉错误的替换逻辑,替换为下面的代码 String sample = content.replaceAll("\\\\", "");
第二步:任选以下一种方案解决字段匹配问题
方案A:全局配置Jackson命名策略(推荐)
给ObjectMapper配置适配大写开头驼峰的命名策略,无需修改POJO代码:
ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
方案B:POJO字段加@JsonProperty注解显式绑定
在每个POJO字段上添加注解,手动指定对应的JSON键名:
@JsonProperty("Code") private String Code; @JsonProperty("QuestionCode") private String QuestionCode; @JsonProperty("Description") private String Description; @JsonProperty("Type") private String Type; @JsonProperty("LastUpdated") private String LastUpdated;
方案C:临时忽略未知字段(仅调试用,不推荐)
如果不需要严格校验字段,只想快速避免报错,可以配置Jackson忽略无法识别的字段:
ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
注意:该方案仅抑制异常抛出,字段仍然会因为匹配失败赋值为null,不适合正式环境使用。
内容的提问来源于stack exchange,提问作者Codeblocks
相关产品推荐
相关产品推荐

