JSONObject.toBean
异常: net.sf.json.JSONException:java.lang.NoSuchMethodException:Unknownproperty'success'onclass'classcom.leagsoft.restservice.common.bean.Message' atnet.sf.json.util.PropertySetStrategy$DefaultPropertySetStrategy.setProperty(PropertySetStrategy.java:45) atnet.sf.json.JSONObject.setProperty(JSONObject.java:1473) atnet.sf.json.JSONObject.toBean(JSONObject.java:474) atnet.sf.json.JSONObject.toBean(JSONObject.java:249) atcom.leagsoft.restservice.json.JsonTest.testJson2(JsonTest.java:20) atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) atsun.reflect.NativeMethodAccessorImpl.invoke(UnknownSource) atsun.reflect.DelegatingMethodAccessorImpl.invoke(UnknownSource) atjava.lang.reflect.Method.invoke(UnknownSource) atorg.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) atorg.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) atorg.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) atorg.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) atorg.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) atorg.junit.runners.ParentRunner$3.run(ParentRunner.java:238) atorg.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) atorg.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) atorg.junit.runners.ParentRunner.access$000(ParentRunner.java:53) atorg.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) atorg.junit.runners.ParentRunner.run(ParentRunner.java:309) atorg.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) atorg.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Causedby:java.lang.NoSuchMethodException:Unknownproperty'success'onclass'classcom.leagsoft.restservice.common.bean.Message' atorg.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:2123) atorg.apache.commons.beanutils.PropertyUtils.setSimpleProperty(PropertyUtils.java:890) atnet.sf.json.util.PropertySetStrategy$DefaultPropertySetStrategy.setProperty(PropertySetStrategy.java:43) ...27more javaBean: packagecom.leagsoft.restservice.common.bean; importjavax.xml.bind.annotation.XmlAccessType; importjavax.xml.bind.annotation.XmlAccessorType; importjavax.xml.bind.annotation.XmlRootElement; importcom.leagsoft.restservice.util.MessageUtil; /** * *@authorHeweipo * */ @XmlRootElement(name="message")//标注类名为XML根节点 @XmlAccessorType(XmlAccessType.FIELD)//表示将所有域作为XML节点 publicclassMessage{ /** *信息获取的状态码 */ privateintstatus; /** *信息获取的提示消息 */ privateStringmsg; publicStringgetMsg(){ returnmsg; } publicvoidsetMsg(Stringmsg){ this.msg=msg; } publicintgetStatus(){ returnstatus; } publicvoidsetStatus(intstatus){ this.status=status; } } 测试程序: publicclassJsonTest{ @Test publicvoidtestJson2(){ Stringjson="{'message':{'status':6000,'msg':'未知异常','success':'true'}}"; Messagemessage=(Message)JSONObject.toBean(JSONObject.fromObject(json).getJSONObject("message"),Message.class); System.out.println(message.getStatus()); } } 结果就报了以上的错误: java.lang.NoSuchMethodException: Unknown property XXXX 具体解决,如下代码: publicclassJsonTest{ @Test publicvoidtestJson2(){ Stringjson="{'message':{'status':6000,'success':'true'}}"; JsonConfigconfig=newJsonConfig(); config.setJavaPropertyFilter(newPropertyFilter(){ publicbooleanapply(ObjectparamObject1,StringparamString,ObjectparamObject2){ if(paramString.equals("status")||paramString.equals("msg")){ returnfalse; } returntrue; }}); Messagemessage=(Message)JSONObject.toBean(JSONObject.fromObject(JSONObject.fromObject(json).getString("message"),config),Message.class); System.out.println(message.getStatus()); } } 总结: config配置项的作用就是过滤属性,出现这个Exception的原因有两点: 1)Json字符串属性过多,没有对应上javaBean的属性,所以程序会抛异常没有对应的属性。(使用gson不会出错)。 2)使用JsonConfig配置项过滤掉多余的属性。注意,是在字符串转为JSONObject的时候过滤。 3)JSONObject.toBean可以接收三个参数,这个接收三个参数的方法不要使用,会报错,而要使用接收两个参数的方法,另外,属性的过滤一定是在转为JSONObject的时候,而不是转Bean的时候。 4)JSONObject.fromObject(JSONObject.fromObject(result).getString("message"),config) 字符串转为JSONObject的时候过滤 5)(Message)JSONObject.toBean(JSONObject.fromObject(JSONObject.fromObject(result).getString("message"),Message.class); 不能使用(Message)JSONObject.toBean(JSONObject.fromObject(JSONObject.fromObject(result).getString("message"),Message.class,config); 否则又报错: 类转换异常 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |