Jackson 处理 JSON
Java 常用的 JSON 处理库包括 Gson、Json-lib、Jackson 等,Jackson 相对来说处理速度更快,拓展功能更加强大;
Jackson 源码:https://github.com/FasterXML/jackson
Jackson 提供了以下2种 JSON 解析器:
- ObjectMapper:把 JSON 解析到 POJO 中,或者解析到一个 Jackson 指定的树形结构中;
- Jackson JsonParser:一种 pull 式的解析器,每次解析一组 JSON 数据,有助于解决大数据量 JSON 文本的内存开销问题;
Jackson 提供了以下2种 JSON 生成器:
- ObjectMapper:将 POJO 或 Jackson 指定的树形结构解析为 JSON ;
- Jackson JsonGenerator:每次生成一组 JSON 数据;
使用 Jackson 库需要导入以下依赖:
com.fasterxml.jackson.core:jackson-core(基础依赖)
com.fasterxml.jackson.core:jackson-databind(数据绑定依赖)
com.fasterxml.jackson.core:jackson-annotations(注解解析依赖)
以下通过一个简单的例子来演示 Jackson 的使用:
POJO 类的标注(使用注解)
Jackson 支持使用注解来对 POJO 属性的转化行为进行标注,以下是常用的 Jackson 注解:
@JsonProperty | 属性别名标注,作用于 字段 |
@JsonIgnore | 忽略属性,作用于 字段 |
@JsonFormat | 属性格式化,作用与 字段 |
以下是示例的2个POJO的标注:
User
import com.fasterxml.jackson.annotation.*;
public class User implements Serializable{
"id") (
private int userId;
"name") (
private String userName;
"city") (
private String userCity;
private String userDescription;
"logs") (
private List<LoginLog> logs;
//省略 getter and setter
}
LoginLog
import com.fasterxml.jackson.annotation.*;
public class LoginLog implements Serializable{
"id") (
private int logId;
"ip") (
private String loginIp;
"date") (
pattern="yyyy-MM-dd") (
private Date loginInDate;
//省略 getter and setter
}
将 POJO 转化为 JSON
//构建 POJO
User user = getUser();
//创建ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//输出到内存
String jsonStr = mapper.writeValueAsString(user);
log.debug(jsonStr);
//输出到文件:以紧凑型JSON格式输出
mapper.writeValue(new PrintWriter("./jacksonSample.json","UTF-8"),user);
//输出到文件:以良好的JSON格式输出
ObjectWriter out = mapper.writerWithDefaultPrettyPrinter();
out.writeValue(new PrintWriter("./jacksonPrettySample.json","UTF-8"),user);
将 JSON 转化为 POJO
String jsonStr = .....;
//创建 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//从内存中读取JSON串
User user1 = mapper.readValue(jsonStr,User.class);
//从文件中读取JSON串
User user2 = mapper.readValue(new InputStreamReader(new FileInputStream("./jacksonSample.json"),"UTF-8"),User.class);