SpringMVC——JSON

SpringMVC——JSON

一、什么是JSON

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在这里插入图片描述
那么到底什么是 JSON ?
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。JSON就是一串字符串 只不过元素会使用特定的符号标注。

二、JSON语法

在JavaScript中,一切都是对象。因此任何数据类型都可以使用JSON来表示。

1.JSON语法:
  • 对象表示为键值对形式
  • 数据由逗号分开
  • 花括号保存对象:{} 双括号表示对象
  • 方括号保存数组:[] 中括号表示数组
  • " " 双引号内是属性或值
  • : 冒号后面是前面对象的值,如:{“name”: “张三”} 表示name的值为张三
2.JSON本质

JSON其实就是JavaScript对象的字符串表示法。本质上就是一个字符串。

	 //JS对象obj
     var obj={name:'张三',age:18}
     //JS对象的JSON形式
     var jsonStr={"name":'张三',"age":"18"}
3.JSON 和 JS 对象互转
  • JSON.parse():JSON字符串转为JS对象

          var jsonStr_obj = JSON.parse('{"name":"张三","age":"18"}');
          console.log(jsonStr_obj)
    

    如果要使用字符串对象要注意方法内部传入的一定要是字符传,属性必须用双引号,比如这样:

            //JS对象的JSON形式
            var jsonStr='{"name":"张三","age":18}';
            //将JSON字符串转换为JS对象
            var jsonStr_obj = JSON.parse(jsonStr+"");
            console.log(jsonStr_obj)
    

    或者这样:

        //JS对象的JSON形式
        var jsonStr="{\"name\":\"张三\",\"age\":18}";
        //将JSON字符串转换为JS对象
        var jsonStr_obj = JSON.parse(jsonStr);
        console.log(jsonStr_obj)
    

    在这里插入图片描述

  • JSON.stringify():JS对象转为JSON字符串

          //JS对象
          var obj={name:'张三',age:18}
          //将JS对象转为JSON字符串
          var obj_json = JSON.stringify(obj);
          console.log(obj_json)
    

    在这里插入图片描述

三、使用Controller实现返回JSON数据

导入Jackson解析的依赖包
我们要使用JSON就需要一个JSON的解析工具,Jackson就是一款比较好的JSON解析工具。

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.8</version>
    </dependency>

编写实体类User

package com.muhan.pojo;

public class User {
    private String name;
    private int age;
	//构造,get,set,toString
}

编写Controller

在编写Controller的的时候我们会用到一个注解@ResponseBody。那这个注解的作用到底是什么呢?
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。我们还要知道@Controller+@ResponseBody=@RestController

package com.muhan.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.muhan.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Controller
public class TestJsonController {
    @RequestMapping("jsonTest")
    @ResponseBody//让返回的字符串不会解析成跳转路径,而是直接返回json数据
    public String jsonTest() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("张三", 18);
        String string = mapper.writeValueAsString(user);
        return string;
    }
}

启动Tomcat测试
在这里插入图片描述
我们发现对象的json格式已经打印到页面上了,但是出现了乱码问题。下面偶们就来处理乱码问题

处理乱码问题
通过@RequestMapper的produces属性来处理乱码问题

@RequestMapping(value = "jsonTest",produces = "application/json;charset=utf-8")

测试
在这里插入图片描述
解决乱码问题高级做法
我们知道如果使用@RequestMapper注解的属性里面配置编码格式的话只会作用与这一个Controller,我们要想一劳永逸的解决乱码问题,就需要在配置文件中配置。我们在注解驱动中配置。

    <!--注解驱动-->
    <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"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

测试:
在这里插入图片描述
解决日期格式问题

编写一个Controller

@Controller
public class TestJsonController {
    @RequestMapping("/jsonTest")
    @ResponseBody
    public String jsonTest() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        Date date = new Date();
        String string = mapper.writeValueAsString(date);
        return string;
    }
}

测试:我们发现如果是日期格式就会编程一个数字
在这里插入图片描述
解决方案:取消timetamps形式,自定义时间格式

@Controller
public class TestJsonController {
    @RequestMapping("/jsonTest")
    @ResponseBody
    public String jsonTest() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        //取消timetamps形式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        //自定义时间格式
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        Date date = new Date();
        String string = mapper.writeValueAsString(date);
        return string;
    }
}

测试:完美解决
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值