亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

jsonObject轉java對象異常

標簽:
Java

场景

使用restTemplate请求接口,返回体使用使用fastjson转为java对象时异常,fastjson版本1.2.48

异常贴示

com.alibaba.fastjson.JSONException: can not get javaBeanDeserializer. com.alibaba.fastjson.JSONObject
	at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1044) ~[fastjson-1.2.48.jar:na]
	at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:692) ~[fastjson-1.2.48.jar:na]
	at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:858) ~[fastjson-1.2.48.jar:na]
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:1180) ~[fastjson-1.2.48.jar:na]
	at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1046) ~[fastjson-1.2.48.jar:na]
	at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:692) ~[fastjson-1.2.48.jar:na]
	at com.alibaba.fastjson.JSON.toJavaObject(JSON.java:997) ~[fastjson-1.2.48.jar:na]
	at ts_for_resttemplate.controller.TestController.test(TestController.java:44) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]

代码示例

Model

public class Message {
    private String address;
    private String age;
}
public class Person {
    private Message message;
    private String name;
}
public class NewPerson {
    private JSONObject message;
    private String name;
}

Controller

@RestController
public class TestController {

	/**
	*	样例数据接口
	*/
    @ResponseBody
    @GetMapping("/test")
    public String  testForRestTemplate() {

        Message message=new Message("杭州","27");
        Person person = new Person(message,"wuhaohan");
        System.out.println("测试接口已被调用");
        return JSONObject.toJSONString(person);
    }

/**
 * 调用接口
 */
    @GetMapping("/")
    public void test(){
        String newUrl = "http://localhost:8080/test";
        RestTemplate template = new RestTemplate();
        HttpEntity<JSONObject> request = new HttpEntity<>(null,null); 

        ResponseEntity<JSONObject> response = template.exchange(newUrl, HttpMethod.GET,request,JSONObject.class);
        NewPerson newPerson = JSONObject.toJavaObject(response.getBody() ,NewPerson.class);
    }

}
通过http://localhost:8080/接口请求,触发异常

规避方式

//方法1.通过将NewPerson中的JSONObject修改为Object类型,演示略去
//方法2.该方法看着有点智障, 即JSONObject 转 String 转 JSONObject
		ResponseEntity<JSONObject> response = template.exchange(newUrl, HttpMethod.GET,request,JSONObject.class);
        NewPerson newPerson = JSONObject.toJavaObject(JSONObject.parseObject(JSONObject.toJSONString(response.getBody())) ,NewPerson.class);

//方法3.使用String接收,手动转JSONObject
        ResponseEntity<String> response = template.getForEntity(newUrl,String.class);
        JSONObject jsonObj = (JSONObject) JSON.parse(response.getBody());
        NewPerson newPerson = JSONObject.toJavaObject(jsonObj ,NewPerson.class);

异常原因

1.异常方式,response.getBody()
图片描述

2.手动转换JSONObject方式
图片描述

	由图可知,两种方式下类中的JSONObject类型的字段message是不同的数据类型。

通过对fastjson代码断点知,LinkedHashMap方式得到的解析器是MapDeserializer,非JavaBeanDeserializer方式
图片描述

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
2
獲贊與收藏
0

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消