json-lib net.sf.json.JSONException: java.lang.NoSuchMethodException

本文探讨了在使用json-lib将JSON数据转换为JavaBean时遇到的异常问题。当JSON数据包含Bean类中不存在的属性,转换过程中会抛出net.sf.json.JSONException: java.lang.NoSuchMethodException。文章详细介绍了问题的原因,并提供了解决方案和问题总结。

问题描述

json-lib ,将json数据转bean时,如果json数据中有bean类没有的属性,转换过程会报net.sf.json.JSONException: java.lang.NoSuchMethodException 异常,类似以下所示:

 

14:32:41,639 ERROR [STDERR] net.sf.json.JSONException: java.lang.NoSuchMethodException: Unknown property 'item'
	at net.sf.json.util.PropertySetStrategy$DefaultPropertySetStrategy._setProperty(PropertySetStrategy.java:69)
	at net.sf.json.util.PropertySetStrategy$DefaultPropertySetStrategy.setProperty(PropertySetStrategy.java:60)

 

 

 

问题解决

json-lib 转bean非常的不友好,客观的讲没有google 的gson.jar 工具强大,如果匹配不上丢失数据就好,不会直接报错,所以实际应用中如果作为客户端的角色无法控制json数据结构,只知道自己关注的数据,简单的说有两种方式:
1)使用map 来解析数据,这种比较简单,但对于复杂数据类型解析会比较的麻烦。
2)使用json-lib JsonConfig 设置策略。
第一种转换来说比较简单,但对于java项目来说如果将对象转换变成map,这个改动会比较大,所以我们一般采用第二种方式。
 

方案解析

1)自定义解析策略
        PropertyStrategyWrapper.java
   
public class PropertyStrategyWrapper extends PropertySetStrategy {
    private PropertySetStrategy original;

    public PropertyStrategyWrapper(PropertySetStrategy original) {
        this.original = original;
    }

    @Override
    public void setProperty(Object o, String string, Object o1) throws JSONException {
        try {
            original.setProperty(o, string, o1);

        } catch (Exception ex) {
        }

    }
}
  2)定义JsonConfig
  
JsonConfig config = new JsonConfig();
Map<String, Object> classMap = new HashMap<String, Object>();
config.setClassMap(classMap);
config.setRootClass(SynnexCentralJsonObject.class);
config.setPropertySetStrategy(new PropertyStrategyWrapper(PropertySetStrategy.DEFAULT));
  3)解析bean
XXJsonObject<xx> jsonObj = (<span style="font-family: 宋体; font-size: 9pt;">XXJsonObject</span><<span style="font-family: 宋体; font-size: 9pt;">XX</span>>)JSONObject.toBean(jsonObject, config);
 

总结

这样我们不需要更改以前的老代码实现json解析自动过滤没有使用的属性.
 
 
 
 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值