开发者社区> 问答> 正文

JSON.parseObject 反序列化得不到字段值(1.2.x 版本正常)

问题描述

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

展开
收起
大圣东游 2023-04-21 12:05:17 607 0
2 条回答
写回答
取消 提交回答
  • 值得去的地方都没有捷径

    如果使用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 这样就可以在反序列化时指定类型,避免了类型转换错误的问题。

    2023-04-21 21:10:26
    赞同 展开评论 打赏
  • 需要加上这个JSONReader.Feature.SupportSmartMatch才能解析不匹配camel命名规则的字段

    TokenResult result = JSON.parseObject(text, TokenResult.class, JSONReader.Feature.SupportSmartMatch);

    原回答者GitHub用户wenshao

    2023-04-21 14:56:00
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载