fastjson 私有属性的坑

本文通过对比FastJSON和Gson在处理不同访问级别属性的实体类时的表现,展示了两者在序列化过程中的差异。FastJSON对于私有属性需要提供getter/setter方法才能正确序列化,而Gson则更为灵活,能够处理各种访问级别的属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用fastjson 序列化实体类时  当属性为私有时 会出现错误

public class CancelReason {
    private String cancelReason;

    public CancelReason(String cancelReason) {
        this.cancelReason = cancelReason;
    }

	public String getcancelReason() {
		return cancelReason;
	}

	public void setcancelReason(String cancelReason) {
		this.cancelReason = cancelReason;
	}
    
    

}
JSON.toJSONString(new CancelReason("xxx"))得出的结果是{}


public class CancelReason {
    public String cancelReason;

    public CancelReason(String cancelReason) {
        this.cancelReason = cancelReason;
    }

	public String getcancelReason() {
		return cancelReason;
	}

	public void setcancelReason(String cancelReason) {
		this.cancelReason = cancelReason;
	}
    
    

}
JSON.toJSONString(new CancelReason("xxx"))得出的结果是 {"cancelReason":"xxx"}


而用gson 不论上述那种情况都能正确解析  o(︶︿︶)o 唉


### 解决 FastJSON 解析对象时属性值为 null 的情况 当遇到 JSON 字符串转换成 Java 对象后,某些字段返回 `null` 值的问题时,可以考虑以下几个方面: #### 1. 检查类定义与 JSON 结构一致性 确保目标 Java 类的成员变量名称和类型与 JSON 数据结构完全匹配。如果存在大小写差异或额外字符,则可能导致解析失败。 ```java public class Job { private String jobTime; // 确认此命名与 JSON 中一致 public String getJobTime() { return jobTime; } public void setJobTime(String jobTime) { this.jobTime = jobTime; } } ``` #### 2. 使用 @JSONField 注解指定映射关系 对于不遵循默认驼峰命名法或其他特殊情况下的字段名对应问题,可以通过添加 `@JSONField(name="")` 来显式指明 JSON 键到类属性之间的映射[^1]。 ```java import com.alibaba.fastjson.annotation.JSONField; public class Job { @JSONField(name = "jobTime") private String job_time_field_name_in_class; // getter 和 setter 方法... } ``` #### 3. 设置反序列化特性 FastJSON 提供了一些配置选项用于控制反序列化的行为,比如设置忽略未知字段、允许部分加载等功能。这有助于提高数据兼容性和健壮性。 ```java // 创建 FastJSON 配置实例并开启相应功能 ParserConfig config = ParserConfig.getGlobalInstance(); config.setAsmEnable(false); // 关闭 ASM 加速模式以增强稳定性 DefaultJSONParser parser = new DefaultJSONParser(jsonString, config); parser.config(Feature.IgnoreNotMatch, true); // 忽略不存在于实体类中的键值对 Object obj = parser.parseObject(Job.class); ``` #### 4. 调试输出原始输入及中间状态 为了更好地定位具体原因,在开发阶段建议打印出实际接收到的 JSON 文本以及经过初步解析后的 Map 形式的临时结果,以便对比分析是否存在意外丢失的信息。 ```java System.out.println("Original JSON string: " + jsonString); Map<String, Object> mapResult = JSONObject.parseObject(jsonString, HashMap.class); System.out.println("Parsed as Map: " + mapResult.toString()); ``` 通过上述措施通常能够有效解决大部分由于 FastJSON 反序列化引起的目标对象属性为空的问题。当然也有可能是因为服务端传输过程中出现了异常而导致客户端接收到了错误的数据格式,因此必要时还需检查网络请求本身是否存在问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值