JSON是什么
现在进入前后端分离时代,后端部署后端,前端独立部署。
后端:提供接口,提供数据
前端独立部署,负责渲染后端数据
- json是一种js标记,是一种轻量级的的数据交互格式。
- 采用完全独立于编程语言的纯文本格式来储存和表示数据
JSON键值对是用来保存JavaScript对象的一种方式,键/值对组合中的键名卸载前面用双引号包裹,使用冒号分隔,然后接着值
JSON和JavaScript的相互转换
JSON–>JavaScript
var obj=JSON.parse({"a":"Hello","b":"world"})
//结果是{a:"Hello",b:"world"}
JavaScript–>JSON
var json =JSON.stringify({a:"Hello",b:"world"})
//结果是{"a":"Hello","b":"world"}
实例
<script type="text/javascript">
//编写一个对象
var user = {
name: "miao",
age: 3,
sex: "男"
};
//将js转换为json对象
var json =JSON.stringify(user);
console.log(json);
//js转json
var obj = JSON.parse(json)
console.log(obj)
</script>
Jackson使用
- jackson是目前比较好用的json解析工具
- 当然工具不止这一个,还有阿里巴巴的fastjson等
- 这里使用jackson,需要导入依赖
Controller返回json数据
创建一个新的controller,写一个json方法,配置如下:
注意配置是@RestController
@RestController //这个注解不会走视图解析器,会直接返回一个字符串
public class UserController {
@RequestMapping("/j1" )
public String json() throws JsonProcessingException {
//jakson , ObjectMapper 可以生成json格式
ObjectMapper mapper =new ObjectMapper();
User user =new User("miao1",3,"男");
String str = mapper.writeValueAsString(user);
return str;
}
}
输出结果是json格式对象
传递多个对象时
@RequestMapping("/j2" )
public String json2() throws JsonProcessingException {
//jakson , ObjectMapper 可以生成json格式
ObjectMapper mapper =new ObjectMapper();
List<User> userList = new ArrayList<User>();
User user1 =new User("miao1",3,"男");
User user2 =new User("miao2",3,"男");
User user3 =new User("miao3",3,"男");
User user4 =new User("miao4",3,"男");
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
String str = mapper.writeValueAsString(userList);
return str;
}
传递时间
传统方法
@RequestMapping("/j3" )
public String json3() throws JsonProcessingException {
ObjectMapper mapper =new ObjectMapper();
Date date = new Date(); //这样的date是一个时间戳,需要转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = mapper.writeValueAsString(sdf.format(date));
return str;
}
使用ObjectMapper进行格式化输出
@RequestMapping("/j3" )
public String json3() throws JsonProcessingException {
ObjectMapper mapper =new ObjectMapper();
//使用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(); //这样的date是一个时间戳,需要转换
return mapper.writeValueAsString(date);;
}
直接输出会出现中文乱码的问题,需要在spring中进行配置统一解决
提取JSON共有部分为JsonUtils
public class JsonUtils {
//方法重载和复用,如果不传入时间格式就用默认的 yyyy-MM-dd HH:mm:ss
public static String getJson(Object object){
return getJson(object,"yyyy-MM-dd HH:mm:ss");
}
//如果传入了自定义时间格式,则调用下面的方法
public static String getJson(Object object,String datesdf){
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
SimpleDateFormat sdf = new SimpleDateFormat(datesdf);
mapper.setDateFormat(sdf);
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
乱码问题处理
spring配置文件如下:
<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>
如果配置了该文件还是乱码,就找一下是不是配置文件中出现了配置覆盖的问题
之前配置过 < /mvc:annotation-driven >设置的注意看是否配置重复了