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);
}
}