net.sf.json.JSONException: java.lang.NoSuchMethodException
2016-09-13 15:09
621 查看
问题描述
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解析自动过滤没有使用的属性.相关文章推荐
- net.sf.json.JSONException: java.lang.NoSuchMethodException
- net.sf.json.JSONException: java.lang.NoSuchMethodException: Property 'username' has no getter method
- net.sf.json.JSONException: java.lang.NoSuchMethodException
- net.sf.json.JSONException: java.lang.NoSuchMethodException: ***.SubjectSum.<init>()
- java.lang.ClassNotFoundException: net.sf.json.JSONObject
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- Android JSON 出现Caused by: java.lang.ClassNotFoundException: net.sf.json.JSONObject;
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException解决方法
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- java的date类型无法读取 出现错误net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- Java转Json:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException & java.lang.NullPointerExcept
- Unable to find parent packages json-default 与java.lang.ClassNotFoundException: net.sf.ezmorph.Morphe
- JSON中 net.sf.json.JSONException: java.lang.NoSuchMethodException异常
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- 解析net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- java.lang.ClassNotFoundException: net.sf.json.JSONArray错误