springmvc-03

json:

一种数据交换的中间商

在前后段分离的时期

json与jsvascript对象的相互转换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        //定义了一个javascript对象
        let user = {
            a: 'Hello',
            b: 'World'
        };

        //将 JS 对象转换为 Json 对象
        let json=JSON.stringify(user);
        //将 Json 对象转换为 JS 对象
        let st=JSON.parse(json);
        
        console.log(json);
        console.log(st);
    </script>
</head>
<body>

</body>
</html>

在controller中返回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.13.1</version>
</dependency>
 

配置web.xml(基本上已经固定了)

<!--    DispatchServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.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>encoding</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>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

创建一个User类(自己看着建)

注:在函数上添加 @ResponseBody 注解,将使该块不走视图解析器,直接按照字符串的样子返回到网页

@RestController这个注解直接在类上加,该类中所有方法都不会被视图解析器解析

在controller中通过 ObjectMapper(jaclson的对象映射器) 对象的  writeValueAsString() 方法将str转换为json对象

@Controller
public class JsonController {
    @RequestMapping("/j1")
    @ResponseBody
    public String test1() throws JsonProcessingException {
        //使用 ObjectMapper 对象将string转化为json
        ObjectMapper mapper = new ObjectMapper();
        User user =new User("陈东1",12,"男");
        //调用
        String str=mapper.writeValueAsString(user);
        return str;
    }
}

这是直接将String类型返回的样子(java)

这是经过转换后的样子(json)

 对于乱码问题,可以通过RequestMapping中的proudect参数来设置

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

这种只能用于小问题,如果很多函数体都需要加参数的话,就很麻烦了

所以,(直接拷贝)在springmvc的配置文件中增加一下代码,就ok了

<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>

返回一个时间类,其正常是一个时间戳(从1970.1.1开始到现在的毫秒?)

    @RequestMapping( "/j2")
    @ResponseBody
    public String test2() throws JsonProcessingException {
        //使用 ObjectMapper 对象将string转化为json
        ObjectMapper mapper = new ObjectMapper();
        Date date=new Date();
        //调用
        String str=mapper.writeValueAsString(date);
        return str;
    }

正常人都看不出来的东西,不适用时间戳

方法一:java

//不使用时间戳的格式
@RequestMapping( "/j2")
@ResponseBody
public String test2() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    //自定义时间格式
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date=new Date();
    String str=mapper.writeValueAsString(sdf.format(date));
    return str;
}

方法二:spring

//不使用时间戳的格式
@RequestMapping( "/j2")
@ResponseBody
public String test2() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    //自定义时间格式
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    mapper.setDateFormat(sdf);
    Date date=new Date();
    String str=mapper.writeValueAsString(date);
    return str;
}

两种方法都需要自定义时间格式 使用 SimpleDateFormat 类创建新的时间格式,格式有固定要求

很容易可以看出,转换为json的jackson方法,魔板都出来了,所以我们将他整合为一个工具类

 思考:工具类应该怎么写,应该按照我们正常调用的程序,将里面所用到的方法封装起来,露出方法名,执行的过程和我们正常写程序应该是一样的。就这个例子来说,我们想把String转换为json格式,需要new一个ObjectMapper ,为了部使用时间戳 mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) 需要加上这个,然后就是设置时间的格式,我们可以让他固定,也可以自由(通过参数设置),还要设置一下spring使用这个样式。最后就是返回了,writeValueAsString。

对于相似的方法,可以重载。

package com.kuang.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 JsonUtils {

    public static String getJson(Object object) throws JsonProcessingException {
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
    }


    public static String getJson(Object object,String form) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //自定义时间格式
        SimpleDateFormat sdf = new SimpleDateFormat(form);
        mapper.setDateFormat(sdf);

        try {
            return mapper.writeValueAsString(object);
        }catch (JsonProcessingException e){
            e.printStackTrace();
        }
        return null;
    }
}

fastjson:阿里巴巴的作品,很中国化,看源码都能理解一些

导包:(看样子用的人不是很多)

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>

然后,搬过来,以后要用我就回来看看

public class FastJsonDemo {
   public static void main(String[] args) {
       //创建一个对象
       User user1 = new User("秦疆1号", 3, "男");
       User user2 = new User("秦疆2号", 3, "男");
       User user3 = new User("秦疆3号", 3, "男");
       User user4 = new User("秦疆4号", 3, "男");
       List<User> list = new ArrayList<User>();
       list.add(user1);
       list.add(user2);
       list.add(user3);
       list.add(user4);

       System.out.println("*******Java对象 转 JSON字符串*******");
       String str1 = JSON.toJSONString(list);
       System.out.println("JSON.toJSONString(list)==>"+str1);
       String str2 = JSON.toJSONString(user1);
       System.out.println("JSON.toJSONString(user1)==>"+str2);

       System.out.println("\n****** JSON字符串 转 Java对象*******");
       User jp_user1=JSON.parseObject(str2,User.class);
       System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);

       System.out.println("\n****** Java对象 转 JSON对象 ******");
       JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
       System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));

       System.out.println("\n****** JSON对象 转 Java对象 ******");
       User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
       System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值