json只是文本格式,在java中就是String。
json格式优点:易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
java中json解析工具有:Jackson、阿里巴巴的fastjson等
分别讲一下Jackson和fastjson
Jackson
Jackson导入jar包,导入jar记得更新lib,不然会classNotFound的
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
随便编写一个User的实体类,要导入lombok
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
</dependency>
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
private String sex;
}
如果无法编译lombok,需要安装plugins。步骤如下:
- 右上角打开File ->Settings -> Plugins
- 点击Browse repositories,弹出框中输入lombok,安装
- 用lombok的时候记得把annotation processing开了
编写Controller,新用到了@ResponseBody,和ObjectMapper对象
-
@RequestMapping中produces参数设置编码格式为utf-8,否则会出现乱码,还要设置文本类型为json
-
@ResponseBody:表示该方法返回字符串,不会经过视图解析器
-
ObjectMapper:jackson的对象映射器,用来解析数据
-
用mapper.writeValueAsString转化为json格式
@RequestMapping(value = "/json1", produces = "application/json;charset=utf-8")
@ResponseBody
public String json1() throws JsonProcessingException {
//创建一个jackson的对象映射器,用来解析数据
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user = new User("yy", 3, "男");
//将我们的对象解析成为json格式
//由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
return mapper.writeValueAsString(user);
}
每次写produces很麻烦,可以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>
@RestController标注在类上,该类下的方法不用加@ResponseBody也返回字符串格式
@RestController
public class HelloController {
@RequestMapping("/json1")
public String json1() throws JsonProcessingException {
User user1 = new User("uu", 3, "男");
User user2 = new User("yy", 3, "男");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
return new ObjectMapper().writeValueAsString(list);
}
}
返回结果:
当我们Date date = new Date();返回date时是时间戳类型,我们可以用mapper.setDateFormat设置返回date的格式,但每次用要写很多行代码,我们可以把它给封装起来作一个JsonUtils类
public class JsonUtils {
public static String getJson(Object object) {
return getJson(object,"yyyy-MM-dd HH:mm:ss");
}
public static String getJson(Object object,String dateFormat) {
ObjectMapper mapper = new ObjectMapper();
//不使用时间戳的方式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//自定义日期格式对象
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
//指定日期格式
mapper.setDateFormat(sdf);
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
每次调用用JsonUtils.getJson就行了
@RequestMapping("/json1")
public String json1() throws JsonProcessingException {
Date date = new Date();
return JsonUtils.getJson(date);
}
(超级像我当时写TP5项目时写的BaseController封装json.encode)
FastJson
FastJson库使用
老样子,先导入FastJson包,记得添加lib
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
FastJson有三个主要的类:
- JSONObject 代表 json 对象
对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。 - JSONArray 代表 json 对象数组
内部是有List接口中的方法来完成操作的。 - JSON 代表JSONObject和JSONArray的转化
仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。
测试代码
@RequestMapping("/json1")
public String json1() throws JsonProcessingException {
User user = new User("a", 3, "男");
// 转json
String str = JSON.toJSONString(user);
// json转object
User user1 = JSON.parseObject(str, User.class);
System.out.println(user1);
return JSON.toJSONString(user);
}
阿里巴巴的FastJson用起来就更方便了,相当于utils已经给我们封装好了