什么是JSON
JSON是我们在开发过程中前后端交互的过程中数据传输的一个格式,给数据一个统一的格式有利于我们编写和解析数据。
JSON实例使用
1、JavaScript中对象和字符串的相互转化
JSON可以将一个对象转换成一个字符串的形式,调用JSON的stringify()方法就可以实现,(会乱码需配置springmvc的配置文件,当然也可以通过修改@RequestMapping的produces属性)例如:
<script type="text/javascript">
//var、const、let
//js对象
const person = {
name: "caoxauo",
age: "21",
gender: "男"
};
// js对象转化为json字符串
const str = JSON.stringify(person);
console.log("js to json is :"+str);
</script>
<!--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>
@RequestMapping(value = "/json",produces = "application/json;charset=utf-8")
控制台输出为:
同样的既然可以给它转成字符串,那么我就应该具备可以给它转回的能力,调用JSON的parse()方法解析字符串就可以实现,例如:
<script type="text/javascript">
// json字符串转回对象
const obj = JSON.parse(str);
console.log("json to js is :")
console.log(obj);
</script>
2、Java中的JSON使用
2-1、对于单个Java实例化对象的转化
创建一个简单的实体类User。
注解解释:@AllArgsConstructor 是lombok中的注解,可以让你已经声明的字段参数去构造函数。
@NoArgsConstructor 也是lombok的注解,产生午餐构造函数。
@Data省略掉的Get()、Set()、toString()方法。
package...
import...
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private String gender;
private int age;
}
lombok是一个工具,需要导入相应的依赖。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
这里引用了一个处理JSON的工具类Jackson(很多这样的工具还有阿里的FastJson等等),导入相应的依赖。
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.2</version>
</dependency>
我们在使用Jackson的条件下处理JSON数据需要一个ObjectMapper对象,这里使用writeValueAsString()方法将我么创建的对象转为字符串,运行程序通过我们的请求映射/json显示结果。
@Controller
//@RestController 直接返回一个字符串 等同于 @Controller和@ResponseBody配合使用的结果;使用@RestController 不走视图解析器。
public class jsonController {
@RequestMapping("/json")
@ResponseBody
public String jsonTest() throws JsonProcessingException {
User user = new User("名字","男",21);
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(user);
return str;
}
}
2-2、对于一个对象的集合的转化
对于单个的对象我们可以通过ObjectMapper.writeValueAsString()方法来转化,那么我们需要对不止一个对象转化呢,可以借助ArrayList对对象进行存储,然后对这个集合进行转化。
@RequestMapping("/json1")
@ResponseBody
public String jsonTest1() throws JsonProcessingException {
ArrayList<User> userList = new ArrayList<User>();
User user1 = new User("一号","男",21);
User user2 = new User("二号","男",21);
User user3 = new User("三号","男",21);
userList.add(user1);
userList.add(user2);
userList.add(user3);
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(userList);
return str;
}
2-3、对时间对象Date()进行转化
对于时间这样有特殊格式或者可以自定义格式的对象的转化。任然使用ObjectMapper.writeValueAsString()方法来转化。
@RequestMapping("/json2")
@ResponseBody
public String jsonTest2() throws JsonProcessingException {
Date d = new Date();
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(d);
System.out.println("当前时间:"+d);//输出检查
return str;
}
结果并不是本地的时间格式转化成的字符串,而是以时间戳的形式展示出来即1970年1月1日至今的毫秒数,但我们print出来的是Tue Apr 13 00:00:58 CST 2021,我们可以使用SimpleDateFormat()方法来格式化时间,然后再使用ObjectMapper.writeValueAsString()方法进行转化。在ObjectMapping中有对时间解析格式进行默认规定为时间戳的操作,可以通过设置关闭然后在设置格式后再进行转化。
@RequestMapping("/json3")
@ResponseBody
public String jsonTest3() throws JsonProcessingException {
Date date = new Date();
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
System.out.println(dateFormat.format(date));//输出检查
return mapper.writeValueAsString(dateFormat.format(date));
/*//另一种方式转换格式
ObjectMapper mapper = new ObjectMapper();
//时间解析默认格式 false 关闭
mapper.configure(SerializationFeature.CLOSE_CLOSEABLE,false);
SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
mapper.setDateFormat(dateFormat);
String str = mapper.writeValueAsString(date);
return str;*/
}