这篇文章主要讲述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对象啦。