- JSON(JavaScript Object Notation,js 对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。
- 采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁清晰的层次结构使得json成为理想的数据交换语言
- 易于人的阅读和编写,同时也易于机器解析和生成,并有效提高网络传输效率。
在JavaScript语言中,一切皆对象。因此,任何JavaScript支持的类都可以通过JSON来表示,例如字符串、数字、对象、数组等。 - 对象表示为键值对,数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
例如:{“name”:“yf”,“age”:21,“sex”:“男”}
这种就表示一个对象
JSON键值对是用来保存JavaScript对象的一种方式,和JavaScript对象的写法也大同小异。
例如JSON和JavaScript的相互转换
<script type="text/javascript">
//编写一个JavaScript对象
var student = {
name:"yf",
age:21,
sex:"男"
}
//将这个对象转换为JSON
var json = JSON.stringify(student);
console.log(json);
console.log("================")
//将json转化为一个对象
var student1 = JSON.parse(json);
console.log(student1);
</script>
在controller中将输出的对象转换为JSON字符串
@RequestMapping("/j1")
@ResponseBody //这样就不会走视图解析器,直接返回一个字符串
public String json1() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("yf", 21, "男");
String s = objectMapper.writeValueAsString(user);
return s;
}
返回集合类型的操作方法也是一样的
public String json1() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("yf", 21, "男");
User user2 = new User("yf", 21, "男");
User user3 = new User("yf", 21, "男");
User user4 = new User("yf", 21, "男");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user2);
list.add(user3);
list.add(user4);
String s = objectMapper.writeValueAsString(list);
return s;
}
@ResponseBody这个注解让controller方法不走视图解析器,直接将返回值输出到前端。
@RestController这个注解让整个controller类不走视图解析器,直接将返回值输出到前端。
ObjectMapper就是JackSon里面的类,可以将对象转化为Json字符串。
结果就是这样的
但是注意到这里是乱码的
乱码解决办法
在@RequestMapping里面有一个 products属性
这个属性中可以设置json输出编码
@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
上一种方法比较麻烦,如果项目中有许多请求则每一个都要添加,可以通过spring配置统一指定,这样就不用每次去处理了。
在springmvc的配置文件上添加一段消息,StringHttpMessageConverter转换配置。
<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>
输出时间的两种方式
如果使用date直接输出,输出到前端的是时间戳,看不懂
解决方法:
- 使用SimpleDateFormat
@RequestMapping("/j2")
public String json2() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Date date = new Date();
//自定义时间格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = dateFormat.format(date);
String s = mapper.writeValueAsString(format);
return s;
}
- 不使用时间戳的方式
@RequestMapping("/j2")
public String json2() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
//不使用时间戳的方式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
Date date = new Date();
//自定义时间格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.setDateFormat(dateFormat);
String s = mapper.writeValueAsString(date);
return s;
}
JsonUtile
先写一个关于时间转换的工具类。
public static String getJson(Object object,String dateFormat){
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
SimpleDateFormat format = new SimpleDateFormat(dateFormat);
mapper.setDateFormat(format);
String s = null;
try {
s = mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return s;
}
然后再写一个普通对象的转换,使用重载,你可能会重新写过一遍objectMapper什么的,但是其实没必要,直接调用前面那个处理时间的就行,dateFormat传递一个默认值就行。
public static String getJson(Object object){
return getJson(object,"yyyy-MM-dd HH:mm:ss");
}
看这多方便对吧。