zoukankan      html  css  js  c++  java
  • 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转换为对应的对象。(如有更好的办法,还望大佬在评论区告诉我一下)

  • 相关阅读:
    Javascript继承,再谈
    RHEL7使用systemctl管理服务
    centos7进入单用户模式修改root密码
    IBM DS5020 管理口密码重置
    IBM小机拆镜像换盘
    HMC版本支持
    IBM产品系列和AIX系统版本
    AIX 6.1创建逻辑卷并挂载【smitty】
    AIX中的网络管理
    创建AIX克隆盘
  • 原文地址:https://www.cnblogs.com/Fantastic-Code/p/11693924.html
Copyright © 2011-2022 走看看