问题描述
JSON.parseObject 反序列化 POJO 对象无法正常得到字段值,反序列化到 JSONObject 能够正常取值。
环境信息
OS信息: Windows 11 家庭中文版 16Gb JDK信息: Oacrle JDK 1.8.0_191 版本信息:Fastjson2 2.0.4
重现步骤
public class JSONTest { @Test public void parse(){ System.out.println("---------------------- JSONObject 解析 ----------------------"); String text = "{"IsSuccess":true,"Data":"1fd1717837744bd2ba967167a6f6f417","Message":"获取身份令牌成功"}"; JSONObject obj = JSON.parseObject(text); obj.keySet().forEach(key-> System.out.println(String.format("%s=%s", key, obj.get(key))));
System.out.println();
System.out.println("---------------------- POJO 解析 ----------------------");
//转换为 POJO
TokenResult result = JSON.parseObject(text, TokenResult.class);
System.out.println("IsSuccess="+result.IsSuccess);
System.out.println("Data="+result.Data);
System.out.println("Message="+result.Message);
}
public static class TokenResult{
String Data;
String Message;
boolean IsSuccess;
public String getData() {
return Data;
}
public TokenResult setData(String data) {
Data = data;
return this;
}
public String getMessage() {
return Message;
}
public TokenResult setMessage(String message) {
Message = message;
return this;
}
public boolean isIsSuccess() {
return IsSuccess;
}
public TokenResult setIsSuccess(boolean success) {
IsSuccess = success;
return this;
}
}
}
结果如下:
---------------------- JSONObject 解析 ---------------------- IsSuccess=true Data=1fd1717837744bd2ba967167a6f6f417 Message=获取身份令牌成功
---------------------- POJO 解析 ---------------------- IsSuccess=false Data=null Message=null
原提问者GitHub用户0604hx
如果使用JSON.parseObject方法反序列化POJO对象时无法正常得到字段值,但是反序列化到JSONObject对象时能够正常取值,可能是因为POJO类的字段与JSON字符串中的字段名称不匹配,导致反序列化失败。
可以尝试以下方法解决问题:
检查POJO类的字段名称是否与JSON字符串中的字段名称一致,包括大小写。如果不一致,可以使用@JSONField注解来指定字段与JSON字符串中的字段名称的映射关系,例如: public class User { @JSONField(name = "user_id") private Long userId; private String name; private Integer age; // getter and setter } java 这样就可以将JSON字符串中的"user_id"字段映射到POJO类的userId字段。
检查JSON字符串中是否包含了所有的字段,如果缺少某个字段,反序列化时会将该字段的值设置为null。可以在POJO类的字段上添加@Nullable注解来表示该字段可以为null,例如: public class User { private Long userId; @Nullable private String name; @Nullable private Integer age; // getter and setter } java 这样就可以在反序列化时将缺少的字段设置为null,避免了字段值获取失败的问题。
如果以上方法都无法解决问题,可以尝试使用JSON.parseObject方法的重载版本,指定反序列化的类型为TypeReference,例如: String jsonStr = "{"userId":1,"name":"Alice"}"; TypeReference typeRef = new TypeReference() {}; User user = JSON.parseObject(jsonStr, typeRef); java 这样就可以在反序列化时指定类型,避免了类型转换错误的问题。
需要加上这个JSONReader.Feature.SupportSmartMatch才能解析不匹配camel命名规则的字段
TokenResult result = JSON.parseObject(text, TokenResult.class, JSONReader.Feature.SupportSmartMatch);
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。