后端如何接受前端传过来的Json数据

本文详细介绍如何在SpringMVC中处理JSON数据,包括前端如何传递JSON对象或JSON字符串,以及后端如何接收并解析这些数据。同时,文章还探讨了不同方式的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Json前提:

引入依赖

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.9</version>
        </dependency>

SpringMVC配置

<mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"></property>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

方式一:前端传递Json对象 <== Ajax默认格式

  <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
  <script>
  <!--Json对象-->
    var user = {
      "username": "hahah",
      "password": "123456"
    };

    $.ajax({
      url:"/testJson",
      type: "GET",
      async: true,
      data: user,//Json对象
      dataType: 'json',
      success: function (data) {

      }
    });
  </script>
public class User {
    private String username;
    private String password;
    //get、set方法
    }

(1)可省略@RequestParam注解

@Controller
public class TestJson {
    @RequestMapping("/testJson")
    @ResponseBody
    public String testJson(User user,String username,String password){
        System.out.println(user.getUsername());//hahah
        System.out.println(user.getPassword());//123456
        System.out.println(username);//hahah
        System.out.println(password);//123456
       return "aaaa";
    }
}

(2) 加@RequestParam注解

    @RequestMapping("/testJson2")
    @ResponseBody
    public String testJson2(@RequestParam String username,@RequestParam String password){
        System.out.println(username);//hahah
        System.out.println(password);//123456
        return "aaaa";
    }

优点:

(1)前端传递数据不用转换为Json字符串:Json.stringify(user)
(2)后端接收参数灵活:
                  ①可以是封装对象 (User)
                  ②可以是单个参数(username,password)
                  ③可以封装对象与单个参数混用(User,username或password)

方式二:传递JSON字符串给后端 <== 使用application/json格式

Content-Type使用application/json的时候,要将JSON对象转换为JSON字符串

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

  <script>
    var user = {
      "username": "hahah",
      "password": "123456"
    };

    $.ajax({
      url:"/testJson3",
      type: "POST",
      async: true,
      contentType: "application/json;charset=UTF-8", //使用 application/json;charset=UTF-8
      data: JSON.stringify(user), //将JSON对象转换为JSON字符串
      dataType: 'json',
      success: function (data) {

      }
    });
  </script>

后端接收前端Json字符串

① 后端接收前端Json字符串,只能封装在User对象中,不能单独设置参数。

    @RequestMapping(value = "/testJson3",method = {RequestMethod.POST})
    @ResponseBody
    public String testJson3(@RequestBody User user){
        System.out.println(user.getUsername());//hahah
        System.out.println(user.getPassword());//123456
        return "aaaa";
    }

② 后端接收前端Json字符串,封装到Map中

    @RequestMapping(value = "/testJson4",method = {RequestMethod.POST})
    @ResponseBody
    public String testJson4(@RequestBody Map map){
        System.out.println(map.get("username"));//hahah
        System.out.println(map.get("password"));//123456
        return "aaaa";
    }

③ 后端接收前端Json字符串,用String接收

    @RequestMapping(value = "/testJson5",method = {RequestMethod.POST})
    @ResponseBody
    public String testJson5(@RequestBody String user) throws IOException {
        System.out.println(user); // {"username":"hahah","password":"123456"}
        ObjectMapper mapper = new ObjectMapper();
        User user1 = mapper.readValue(user, User.class);
        System.out.println(user1.getUsername());//hahah
        System.out.println(user1.getPassword());//123456
        return "aaaa";
    }

优点:

(1)前端需要使用JSON.stringify()将JSON对象转为JSON字符串
(2)后端接收参数比较麻烦,没有第一种简单,也没有第一种灵活。

### JSON 中英文括号转义为 HTML 实体 当从前端后端传输 JSON 数据时,如果遇到特殊字符(如 `<` 和 `>`),这些字符会被自动转换为对应的 HTML 实体。这种情况下,在后端接收并处理 JSON 数据之前,需要先解码这些 HTML 实体。 对于 JSON 字符串中的大括号 `{}` 或其他可能被浏览器解释为 HTML 的符号,通常不会直接转化为 HTML 实体,但如果确实发生了这种情况,则可以采取以下措施: #### 后端处理方式 在 Java 中可以通过 Apache Commons Lang 库提供的 `StringEscapeUtils.unescapeHtml4()` 方法来解除 HTML 编码[^1]。此函数会把所有的 HTML 实体还原回原始字符形式,从而使得原本被编码的大括号恢复正常显示。 另外一种通用的方式是在接收到请求参数之后立即对其进行 URL 解码操作,这能够有效防止由于前端进行了 URLEncode 导致的数据异常情况发生。例如,在 Spring MVC 框架下可以直接利用 HttpServletRequest 对象自带的 getParameter() 函数获取已经经过服务器内部解码过的参数值;或者手动调用 java.net.URLDecoder.decode(String s, String enc) 来完成同样的工作[^4]。 ```java // 使用 Apache Commons Lang 进行 HTML 实体解码 import org.apache.commons.lang3.StringEscapeUtils; public class JsonHandler { public void handleJsonData(String jsonData){ // 假设此时 jsonData 是带有 HTML 实体编码的内容 String decodedJson = StringEscapeUtils.unescapeHtml4(jsonData); // 继续后续逻辑... } } ``` 需要注意的是,为了确保安全性,应该只对接收自不可信源的数据执行此类解码过程,并且应当验证输入的有效性和合法性以防范潜在的安全风险。 #### 预防措施 为了避免不必要的麻烦,建议开发者们遵循最佳实践原则——即始终确保前后端之间交互的数据是以正确格式化后的纯文本状态存在的。也就是说,在发送前应通过合适的序列化手段将复杂结构的对象转变为简单的字符串表示法,而在接收方则相反地实施反序列化的动作。这样不仅可以简化开发流程,也可以减少因不当处理而引发的各种问题。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值