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对象啦。


  • 22
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值