springMVC的controller层接收前端json数据

1.前端的操作:

  对象接收json数据方式:将所需要传的数据转化为json数据,并将这些数据以post方式传到后台的controller层,然后controller层接收json数据,并且是以对象的形式进行接收。

 这里面是springmvc自动控制将这些数据转化为对象,不需要辅助包fastjson。

  用Map<String,Object>接收json数据:需要使用fastjson包(前提json含有对象数据)。在看github项目的学习过程中,发现:封装的对象中,可以有map<String,Object>类型,更加方便地接收参数,将json数据一一绑定到map映射中,方便我们对json数据操作哦。

2.代码实现:

模拟前端传过来的json数据

{
    "people": {
        "username": "Tom",
        "password": "123456",
        "sex": "男",
        "address": {
            "province": "安徽",
            "city": "芜湖",
            "town": "天堑",
            "village": "小岗村"
        },
        "phones": [
            {
                "operator": "中国移动",
                "phoneNumber": "12345678901"
            },
            {
                "operator": "中国联通",
                "phoneNumber": "09876543211"
            }
        ]
    }
}

Address.java

import lombok.Data;

@Data
public class Address {
    private String province;
    private String city;
    private String town;
    private String village;
}

Phone.java

import lombok.Data;

@Data
public class Phone {
    private String operator;
    private String phoneNumber;
}

People.java

import lombok.Data;

import java.util.List;

@Data
public class People {
    private String username;
    private String password;
    private String sex;
    private Address address;
    private List<Phone> phones;
}

controller类

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yyj.demo.pojo.Address;
import com.yyj.demo.pojo.People;
import com.yyj.demo.pojo.Phone;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/people")
public class PersonController {
    @RequestMapping("getPeople")
    public Map<String,Object> getPeople(@RequestBody People people){
        if(people == null){
            return null;
        }
        Map<String,Object> param = new HashMap<String, Object>();
        String s = people.getPhones().toString();
        System.out.println(s);
        param.put("people",people);
        return param;
    }
    @RequestMapping("getOtherPeople")
    public Map<String,Object> getOtherPeople(@RequestBody Map<String,Object> params){
        if(params == null){
            System.out.println("系统接收参数错误");
            return null;
        }
        Map<String,Object> map = new HashMap<>();
        People people = new People();
        people.setUsername(params.get("username").toString());
        people.setPassword(params.get("password").toString());
        people.setSex(params.get("sex").toString());
        people.setAddress(JSON.parseObject(JSONObject.toJSONString(params.get("address")),Address.class));
        people.setPhones((ArrayList<Phone>) params.get("phones"));
        map.put("people",people);
        return map;
    }
}
/*
{
    "username": "Tom",
    "password": "123456",
    "sex": "男",
    "address": {
        "province": "安徽",
        "city": "芜湖",
        "town": "天堑",
        "village": "小岗村"
    },
    "phones": [{
            "operator": "中国移动",
            "phoneNumber": "12345678901"
        },
        {
            "operator": "中国联通",
            "phoneNumber": "09876543211"
        }
    ]
}
 */

3.postman测试结果:

  对象接收方式:

 

   Map<String,Object>接收json数据

 4.第二种方式需要添加alibaba的fastjson依赖

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

5.第二种实现方式遇到的各种坑:

  使用@ResquestBody Map<String,Object>接收前端json数据,json数据中有数组,我们不能用String[]去接收这个数组,要用ArrayList<String>去接收,原因如下:@RequsetBody会读取request的body数据,之后会调用MappingJackson2HttpMessageConverter解析数据,会使用到ObjectMapper,之后this.objectMapper.readValue(inputMessage.getBody(), javaType);javaType是AbstractJackson2HttpMessageConverter中getJavaType优选出来可以解析context的类型.

  json数据中有对象数据存在时,我们不能单纯的去直接用这个对象接收这个数据,会报错的。报错内容:java.util.LinkedHashMap cannot be cast to ******我的具体做法如下:我们可以接收的hashmap转换为json,然后再次把这个json转换为对应的对象。(如有更好的办法,还望大佬在评论区告诉我一下)

猜你喜欢

转载自www.cnblogs.com/Fantastic-Code/p/11693924.html