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);

否则又报错:

类转换异常

相关文章

AJAX是一种基于JavaScript和XML的技术,能够使网页实现异步交...
在网页开发中,我们常常需要通过Ajax从后端获取数据并在页面...
在前端开发中,经常需要循环JSON对象数组进行数据操作。使用...
AJAX(Asynchronous JavaScript and XML)是一种用于创建 We...
AJAX技术被广泛应用于现代Web开发,它可以在无需重新加载页面...
Ajax是一种通过JavaScript和HTTP请求交互的技术,可以实现无...