SpringBoot接收前端的json參數並解析

這篇文章主要講述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庫來解析,步驟如下:

  1. pom.xml添加dependency,代碼如下:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.57</version>
    </dependency>
    

    注意上面的版本號是可以改的;

  2. 使用JSONObject接收json參數,代碼如下:

    public Object create_questionare_task(@RequestBody JSONObject param){
        //使用JSONOject接收整個json參數,放在param變量中
    }
    
  3. 從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對象啦。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章