聊聊@RequestBody和Json之間的關(guān)系
在使用springmvc的時(shí)候,后臺(tái)@RequestBody接受的是一個(gè)json格式的字符串,一定是一個(gè)字符串。
我們可以通過(guò)@RequestBody Map
@RequestMapping(value="/queryAccountList.do",produces="application/json;charset=UTF-8")
@ResponseBody
public HashMap<String, Object> queryAccountList(@RequestBody Map<String, Object> paramsMap){
System.out.println("paramsMap="+paramsMap);
String channel= (String) paramsMap.get("channel");
String function_code=(String) paramsMap.get("function_code");
Map<String, Object> reqParam=(Map<String, Object>)paramsMap.get("data");
當(dāng)前端調(diào)用我們的接口時(shí),傳入json字符串,就轉(zhuǎn)為了map對(duì)象。這里主要是@RequestBody的底層實(shí)現(xiàn),我們不討論。
json對(duì)象和json字符串的區(qū)別:
var person={“name”:”zhangsan”,”sex”:”男”,”age”:”24”}//json對(duì)象
var person='{“name”:”zhangsan”,”sex”:”男”,”age”:”24”}';//json字符串
json對(duì)象轉(zhuǎn)為json字符串,調(diào)用stringify方法:
var person={"name":"zhangsan","sex":"男","age":"24"};//json對(duì)象
var personString = JSON.stringify(person);
alert(personString);
SpringMVC接受json字符串類(lèi)型
在SpringMVC中基于REST開(kāi)發(fā)時(shí),前端傳入后臺(tái)的應(yīng)該是一個(gè)json格式的字符串,而不是一個(gè)json對(duì)象
GET、POST方式提時(shí), 根據(jù)request header Content-Type的值來(lái)判斷:
application/x-www-form-urlencoded, 可選(即非必須,因?yàn)檫@種情況的數(shù)據(jù)@RequestParam, @ModelAttribute也可以處理,當(dāng)然@RequestBody也能處理);
multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數(shù)據(jù));
其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數(shù)據(jù),必須使用@RequestBody來(lái)處理)。
@RequestBody 處理類(lèi)型 和 對(duì)象 和 json相互轉(zhuǎn)換
1 @RequestBody 處理類(lèi)型
在項(xiàng)目中經(jīng)??吹絚ontroller 中有 @RequestBody 字樣,他到底有什么作用?
一般使用表單提交數(shù)據(jù)時(shí)不需要使用@RequestBody 即可自動(dòng)封裝數(shù)據(jù)到對(duì)應(yīng)的 Bean 中。@RequestBody 用來(lái)處理Content-Type: application/json, application/xml等
它是通過(guò)使用HandlerAdapter 配置的HttpMessageConverters來(lái)解析post data body,然后綁定到相應(yīng)的bean上的。
說(shuō)明:使用 @RequestBody 解析數(shù)據(jù)需要添加 jackson 或 fastjson 依賴(lài)包。
maven 引入 fastjson 包
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
2 對(duì)象 和 json 相互轉(zhuǎn)換
在項(xiàng)目中經(jīng)常會(huì)遇到對(duì)象和 json 之間相互轉(zhuǎn)換,公共類(lèi) 和 json 對(duì)象轉(zhuǎn)換, 靜態(tài)內(nèi)部類(lèi) 和 json 對(duì)象轉(zhuǎn)換
2.1 沒(méi)有內(nèi)部類(lèi)時(shí) Student 類(lèi)
@Data
public class Student {
private String id;
private String name;
private int age;
private String sex;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
json 和 對(duì)象 相互轉(zhuǎn)換
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
Student student = new Student();
student.setName("good");
String s = mapper.writeValueAsString(student);
System.out.println(s);
Student hd2 = mapper.readValue(s, Student.class);
System.out.println(hd2);
}
2.2 有靜態(tài)內(nèi)部類(lèi)時(shí) Student 類(lèi)
@Data
public class Student {
private String id;
private String name;
private int age;
private String sex;
private HomeData homeData;
private BigDecimal salary;
private String[] tel;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
@Data
public static class HomeData{
private Address address;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
@Data
public static class Address {
private String country;
private String city;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
}
}
json 和 對(duì)象 之間相互轉(zhuǎn)換
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
Student student = new Student();
Student.HomeData homeData = new Student.HomeData();
Student.HomeData.Address address = new Student.HomeData.Address();
address.setCountry("中國(guó)");
address.setCity("上海");
homeData.setAddress(address);
student.setHomeData(homeData);
String s = mapper.writeValueAsString(address);
System.out.println(s);
Student.HomeData.Address hd2 = mapper.readValue(s, Student.HomeData.Address.class);
System.out.println(hd2);
}
說(shuō)明:主要方法有 mapper.writeValueAsString 和 mapper.readValue
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- html加css樣式實(shí)現(xiàn)js美食項(xiàng)目首頁(yè)示例代碼
- HTML+CSS+JavaScript做女朋友版的刮刮樂(lè)(一看就會(huì))
- JavaScript中html畫(huà)布的使用與頁(yè)面存儲(chǔ)技術(shù)詳解
- JS、CSS和HTML實(shí)現(xiàn)注冊(cè)頁(yè)面
- SpringMVC @RequestBody Date類(lèi)型的Json轉(zhuǎn)換方式
- C#通過(guò)HttpWebRequest發(fā)送帶有JSON Body的POST請(qǐng)求實(shí)現(xiàn)
- 解決@RequestBody接收json對(duì)象報(bào)錯(cuò)415的問(wèn)題
- 在js中修改html body的樣式
相關(guān)文章
Java多線程編程中synchronized關(guān)鍵字的基礎(chǔ)用法講解
Java的synchronized關(guān)鍵字用于修飾線程同步,用以線程資源共享的目的等,下面就帶來(lái)簡(jiǎn)單的Java多線程編程中synchronized關(guān)鍵字的基礎(chǔ)用法講解2016-06-06
淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程
這篇文章主要介紹了淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程的相關(guān)內(nèi)容,小編覺(jué)得還是挺不錯(cuò)的,這里給大家分享一下,需要的朋友可以參考。2017-10-10
使用Spirng Boot Admin監(jiān)控Spring Cloud應(yīng)用項(xiàng)目
這篇文章主要介紹了使用Spirng Boot Admin監(jiān)控Spring Cloud應(yīng)用項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Java 設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解建造者模式
建造者模式,是一種對(duì)象構(gòu)建模式 它可以將復(fù)雜對(duì)象的建造過(guò)程抽象出來(lái),使這個(gè)抽象過(guò)程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對(duì)象。本文將通過(guò)示例講解建造者模式,需要的可以參考一下2022-04-04
分享Java8中通過(guò)Stream對(duì)列表進(jìn)行去重的實(shí)現(xiàn)
本文主要介紹了分享Java8中通過(guò)Stream對(duì)列表進(jìn)行去重的實(shí)現(xiàn),包括兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11
Java Spring數(shù)據(jù)單元配置過(guò)程解析
這篇文章主要介紹了Java Spring數(shù)據(jù)單元配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
springboot自定義starter方法及注解實(shí)例
這篇文章主要為大家介紹了springboot自定義starter方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
使用Java實(shí)現(xiàn)一個(gè)解析CURL腳本小工具
文章介紹了如何使用Java實(shí)現(xiàn)一個(gè)解析CURL腳本的工具,該工具可以將CURL腳本中的Header解析為KV Map結(jié)構(gòu),獲取URL路徑、請(qǐng)求類(lèi)型,解析URL參數(shù)列表和Body請(qǐng)求體,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-02-02

