這篇文章主要講述Springboot如何處理前端發過來的json數據並對其進行解析,提取我們想要的內容。首先聲明一下我們的幾個java類如下:
//以下類中屬性的get方法和set方法均省略
public class Task {
private Integer taskId;
private Integer missionId;
private Integer pubUserId;
private Integer accUserId;
private Integer taskStatus; // 有哪些status,分別對應哪些數字
private String finishTime;
private Integer taskType;
}
public class Question {
private int questionId;
private int questionType;
private String question;
private String answer;
private int choiceNum; // ?
private String choiceStr; //這個變量是幹啥的?
private int questionareId;
}
public class Questionare {
private Integer questionareId;
private Integer questionNum;
private Integer taskId;
@Autowired
private ArrayList<Question> questions;
}
首先我們來講一下第一種比較簡單的情況:發過來的json參數的鍵值對與我們聲明的某個類的屬性是剛好對應的,比如:
{
"taskId": 0,
"MissionId": 0,
"pubUserId": 0,
"accUserId": 0,
"taskStatus": 0,
"finishTime": "string",
"taskType": 0
}
不難發現,這個Json的鍵值對和Task類的屬性是一一對應的。此時我們可以通過使用@RequestBody很簡單的將前端發過來的Json文件直接映射爲task對象,代碼如下:
public void teaching(@RequestBody Task task){
// task對象的屬性取值即爲json參數裏對應鍵的取值
}
第二種情況:發過來的json參數是多個類的嵌套,不能對應任何一個數據類,比如:
{
"task": {
"taskId": 0,
"MissionId": 0,
"pubUserId": 0,
"accUserId": 0,
"taskStatus": 0,
"finishTime": "string",
"taskType": 0
},
"questionare": {
"questionareId": 0,
"questionNum": 0,
"taskId": 0,
"quesitons": [
{
"questionId": 0,
"questionType": 0,
"question": "string",
"answer": "string",
"choiceNum": 0,
"choiceStr": "string",
"questionareId": 0
}
]
}
}
這種情況下,我們不能直接將json參數轉化爲數據對象,此時引入阿里巴巴的fastjson庫來解析,步驟如下:
-
pom.xml添加dependency,代碼如下:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.57</version> </dependency>
注意上面的版本號是可以改的;
-
使用JSONObject接收json參數,代碼如下:
public Object create_questionare_task(@RequestBody JSONObject param){ //使用JSONOject接收整個json參數,放在param變量中 }
-
從param中分別獲取各個數據對象
由2,param是一個JSONOject對象,我們想要從中提取出各個數據類對象,首先需要從中先獲取到各個類的JSONObject對象,再將其轉化爲java對象,以task爲例,代碼如下:
JSONObject task_json = param.getJSONObject("task"); Task task = (Task)JSONObject.toJavaObject(task_json,Task.class);
這樣我們就順利地得到了task對象。但是在上面這個例子中,最麻煩的是question對象的獲取,因爲它還嵌套在questionare對象的questions數組裏面。爲了獲得question對象,我們首先要獲取questionare的JSONObject對象,再從此對象裏獲取questions的json數據,因爲questions是一個數組,所以我們不能將其轉化爲JSONObject對象,應該將其轉化爲JSONArray對象,然後遍歷JSONArray對象,取出其中的question對象,代碼如下:
JSONObject questionare_json = param.getJSONObject("questionare"); JSONArray questions_json = questionare_json.getJSONArray("questions"); for(int i = 0; i < questions_json.size(); i++){ JSONObject question_json = (JSONObject)questions_json.getJSONObject(i); //這裏不能是get(i),get(i)只會得到鍵值對 Question question = (Question)JSONObject.toJavaObject(question_json,Question.class); }
這樣我們就順利取出我們要的question對象啦。