JSON数据

JSON数据转换

JSON

自我理解:json就是一个字符串,是有格式的string,一般的string不能直接转换为json,需要通过JSON.parse来转换。

没写@responseBody就要写方法参数(HttpServletResponse和response.getWriter().print(数据)),然后才能将数据通过response携带给服务器。写了注解,就是默认将返回值作为response携带给前端,写了注解就不用写response参数了。

ajax就是前端写入的数通过鼠标点击、焦点消失的事件来响应给后端,后端如果写了@ResponseBody就将返回值作为数据通过response携带给前端,前端ajax里然后再拿着数据去返回给浏览器

注意:在浏览器中response的数据是json字符串格式的,而在前端中ajax函数里返回放入数据faction(data)是你返回值类型。所以你直接去地址栏输入后端的请求,浏览器resp显示的就是json字符串数据。

在浏览器中xhr类型就是ajax请求。

json(基本转换)

将js对象装换为json字符串用的方法是JSON.stringify(user)

将json字符串转换为js对象用的方法是JSON.parse(str)

 <body>
     <script type="text/javascript">
        //编写一个对象
        var user={
            name:"zhangsan",
            age:32,
            sex:"男"
        };
        console.log(user);//输出这个对象
        //将js对象转换为json字符串
        var str=JSON.stringify(user);
        console.log(str);
      
        格式
        {
        "name":"zhangsan",
        "age":32,
        "sex":"男"
        }
        
        //将json字符串转换为js对象
        var obj=JSON.parse(str);
        console.log(obj);
	</script>
</body>

json:后端传递数据

  1. @ResponseBody注解;就是把后台的对象转换成json对象,返回页面

  2. 可以用jacksonjar包插件来将数据对象通过ObjectMapper类转换为JSON对象

    导入jackson的jar包,Maven依赖。

    <dependency>    
        <groupId>com.fasterxml.jackson.core</groupId>    
        <artifactId>jackson-databind</artifactId>    
        <version>2.9.8</version>
    </dependency>
    
@RequestMapping ("/json1")    
//思考问题,我们正常返回他会走视图解析器,而json需要返回的是一个字符串    
//1.市面上有很多第三方jar包可以实现这个功能,如jackson,只需要一个简单的注解就可以实现了    
//2.而可以使用spring自带的@ResponseBody注解,可以将服务器返回的对象转换为JSON对象响应回去    
@ResponseBody    
public String json1() throws JsonProcessingException {        
    //需要一个jackson的对象映射器,就是一个类,使用它可以直接将对象转换为JSON字符串        
    ObjectMapper mapper = new ObjectMapper();        
    //创建一个对象        
    User user = new User("Tang", 21, "男");        
    System.out.println(user);        
    //将java对象转换为json字符串        
    String str=mapper.writeValueAsString(user);        
    System.out.println(str);        
    return str;
//由于使用了@ResponseBody注解,这里会将str对象以json格式的字符串返回,十分方便        
//这里直接返回user对象,在浏览器中返回显示的也是json字符串        
//注意:这里用ObjectMapper把User对象来转为json字符串 会出现乱码问题        
//用@ResponseBody注解直接返回user对象,在浏览器中显示不会出现乱码问题 }
json1:解决字符串乱码现象

第一种方式是直接在@RequestMapping的produces属性来实现,修改下代码

 //1.发现一个问题,乱码了,怎么解决? 给@RequestMapping加一个属性    
 //通过@RequestMapping的produces属性来实现,修改下代码    
 //2.发现出现了乱码问题,我们需要设置一下他的编码格式为utf-8,以及它返回的类型    
 @RequestMapping (value="/json2",produces = "application/json;charset=utf-8")    
 @ResponseBody    
 public String json2() throws JsonProcessingException {        
 //创建一个对象        
 User user = new User("Tang2号", 20, "男");        
 return new ObjectMapper().writeValueAsString(user);
 //由于使用了@ResponseBody注解,这里会将str对象以json格式的字符串返回,十分方便    
 }

第二种方式是在springmvc配置文件中解决

json乱码配置:

<!--JSON乱码问题配置-->
<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>
json2:将集合转换为json对象
//集合转换为json对象
@RequestMapping ("/json3")
@ResponseBody
public String json3() throws JsonProcessingException {    
    ArrayList<User> list = new ArrayList<>();    
    User user1 = new User("花花1号", 1, "男");    
    User user2 = new User("花花2号", 1, "女");    
    User user3 = new User("花花3号", 2, "女");    
    User user4 = new User("花花4号", 2, "男");    
    list.add(user1);    
    list.add(user2);    
    list.add(user3);    
    list.add(user4);    
    return new ObjectMapper().writeValueAsString(list);    
    //直接返回把返回值设为list类型也可以,因为有@ResponseBody会自动转为json格式
}
json3:将时间转换为JSON
//将时间date转换为json对象,不设置时间的格式就返回的是时间戳
@RequestMapping ("/time1")
@ResponseBody
public String json4() throws JsonProcessingException {    
    Date date = new Date();    
    System.out.println(date);    
    //发现问题:时间默认返回的json字符串变成了时间戳的格式:1645443429904 Timestamp    
    return new ObjectMapper().writeValueAsString(date);
}

发现问题:时间默认返回的json字符串变成了时间戳的格式:1645443429904 Timestamp

json4:将时间按照一定的格式输出
//将date转换为json对象,让它返回的不是时间戳而是时间的正确格式
@RequestMapping ("/time2")
@ResponseBody
public String json5() throws JsonProcessingException {    
    ObjectMapper objectMapper = new ObjectMapper();    
    //1.如何让他不返回时间戳!所以我们要关闭它的时间戳功能       
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);    
    //2.进行时间格式化!选择自定义日期格式对象    
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //注意这里的字母大小写格式,大写小写区别很大    
    objectMapper.setDateFormat(dateFormat);    
    //写一个date日期对象    
    Date date = new Date();    
    return objectMapper.writeValueAsString(date);
}

发现问题:重复代码太多,于是构造工具类

json5:优化,封装重复的代码,这里改的是时间的格式
package com.tang.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
/** * 将时间格式纠正,而不是时间戳 */
public class JsonTimeUtils {    
    //默认时间格式化    
    public static String getJson(Object object){        
        return getJson(object,"yyyy-HH-dd HH:mm:ss");    
    }    
    //自定义一个时间格式化    
    public static String getJson(Object object,String dateFormat) {        
        ObjectMapper objectMapper = new ObjectMapper();        
        //1.如何让他不返回时间戳!所以我们要关闭它的时间戳功能        
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);        
        //2.进行时间格式化!选择自定义日期格式对象        
        SimpleDateFormat format = new SimpleDateFormat(dateFormat);
        //注意这里的字母大小写格式,大写小写区别很大        
        //3.让mapper指定时间日期格式为simpleDateFormat        
        objectMapper.setDateFormat(format);        
        try {            
            return objectMapper.writeValueAsString(object);        
        } catch (JsonProcessingException e) {            
            e.printStackTrace();        
        }        return null;    
    }}

后端传递时间数据

//从以上发现很多代码可能不只用一次,于是可以将一些重复代码进行封装,我们这里将时间转换的代码一起用JsonTimeUtils进行封装
@RequestMapping (value = "/time3")
@ResponseBodypublic String json6(){    
    //写一个date日期对象    
    Date date = new Date();    
    return JsonTimeUtils.getJson(date);
}

过程

这里的过程应该是后端创建一个数据对象,想传递给前端,前端接收数据支持的格式即使json对象,所以我们要讲数据对象转换为JSON对象,@RquestMapper决定了请求,@ResponseBody决定了响应的数据

这里需要配置的springmvc和jar包注意:

springmvc的web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee    
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"         
         version="4.0"         
         metadata-complete="true">    
    <!--配置DispatcherServlet:这个是SpringMVC的核心,请求分发器,前端控制器-->    
    <servlet>        
        <servlet-name>springmvc</servlet-name>        
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        
        <!--DispatcherServlet要绑定Spring的配置文件-->        
        <!--springmvc-servlet.xml这个文件是要新建在resources路径下-->        
        <init-param>            
            <param-name>contextConfigLocation</param-name>            
            <param-value>classpath:springmvc-servlet.xml</param-value>        
        </init-param>        
        <load-on-startup>1</load-on-startup>    
    </servlet>    
    <servlet-mapping>        
        <servlet-name>springmvc</servlet-name>        
        <url-pattern>/</url-pattern>    
    </servlet-mapping>
<!--配置过滤器-->    
    <filter>        
        <filter-name>myFilter</filter-name>        
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        
        <init-param>            
            <param-name>encoding</param-name>            
            <param-value>utf-8</param-value>        
        </init-param>    
    </filter>    
    <filter-mapping>        
        <filter-name>myFilter</filter-name>        
        <url-pattern>/*</url-pattern>    
    </filter-mapping></web-app>

springmvc的配置文件springmvc-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"       
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       
       xmlns:context="http://www.springframework.org/schema/context"       
       xmlns:mvc="http://www.springframework.org/schema/mvc"       
       xsi:schemaLocation="http://www.springframework.org/schema/beans           
                           http://www.springframework.org/schema/beans/spring-beans.xsd           
                           http://www.springframework.org/schema/context           
                           http://www.springframework.org/schema/context/spring-context.xsd           
                           http://www.springframework.org/schema/mvc           
                           http://www.springframework.org/schema/mvc/spring-mvc.xsd">    
    <!--开启注解:扫描com.qiu.controller包下的所有注解-->    
    <context:component-scan base-package="com.tang.controller"/>    
    <!--让SpringMVC不处理静态资源 .css .js .html .mp3 .mp4-->    
    <mvc:default-servlet-handler/>    
    <!--支持mvc注解驱动    
     在spring中一般采用@RequestMapping注解来完成映射关系    
     要想使@RequestMapping注解生效,必须向上下文注册DefaultAnnotationHandleMapping    
     和一个AnnotationMethodHandlerAdapter实例    这两个实例分别在类级别和方法级别处理    
     而annotation-driven配置帮助我们自动完成上述两个实例的注入<mvc:annotation-driven/>    
     -->    
    <!--JSON乱码问题配置-->    
    <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>    
    <!--视图解析器-->    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"          id="internalResourceViewResolver">        
        <!--前缀-->        
        <property name="prefix" value="/WEB-INF/jsp/"/>        
        <!--后缀-->        
        <property name="suffix" value=".jsp"/>    
    </bean>
</beans>

需要的jar包:

<dependency>    
    <groupId>org.springframework</groupId>    
    <artifactId>spring-context</artifactId>    
    <version>5.2.0.RELEASE</version>
    </dependency>
    <dependency>    
    <groupId>org.springframework</groupId>    
    <artifactId>spring-web</artifactId>    
    <version>5.2.0.RELEASE</version>
    </dependency>
    <dependency>    
    <groupId>org.springframework</groupId>    
    <artifactId>spring-webmvc</artifactId>    
    <version>5.2.0.RELEASE</version>
    </dependency>
    <dependency>    
    <groupId>javax.servlet</groupId>    
    <artifactId>servlet-api</artifactId>    
    <version>2.5</version>
    </dependency>
    <dependency>    
    <groupId>com.fasterxml.jackson.core</groupId>    
    <artifactId>jackson-databind</artifactId>    
    <version>2.9.8</version>
 </dependency>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值