Java下常见的Json类库有Gson、JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换。
Maven依赖
// fasterxml/jackson依赖
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
// codehaus/jackson依赖(本文探讨)
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.11</version>
</dependency>
Jackson注解
Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解。
@JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性。
@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称。
@JsonSerialize 此注解作用于类上,作用是指定序列化方式。例如include = Inclusion.NON_NULL,表示非空值才被序列化。
@JsonSerialize(include = Inclusion.NON_EMPTY)
public class Person {
@JsonProperty("name")
private String name;
@JsonIgnore
private int age;
// Unix timestamp, unit: ms
@JsonProperty("birth_day")
private Date birthday;
@JsonProperty("profession")
private String[] profession;
getter() / setter() ...
}
Jackson序列化
private static final Logger logger = Logger.getLogger(
JacksonTest.class.getSimpleName());
/*
* ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中实现。
* ObjectMapper有多个JSON序列化的方法,可以把JSON字符串保存File、OutputStream等
* 不同的介质中。
*
* writeValue(File arg0, Object arg1)
* 把arg1转成json序列,并保存到arg0文件中。
* writeValue(OutputStream arg0, Object arg1)
* 把arg1转成json序列,并保存到arg0输出流中。
* writeValueAsBytes(Object arg0)
* 把arg0转成json序列,并把结果输出成字节数组。
* writeValueAsString(Object arg0)
* 把arg0转成json序列,并把结果输出成字符串。
*/
public static void main(String[] args) throws ParseException,
JsonGenerationException, JsonMappingException,IOException {
Person person = new Person();
person.setName("Emmo");
person.setAge(23);
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
person.setBirthday(dateformat.parse("1992-10-01"));
person.setProfession(new String[] { "cook" });
// 序列化自定义对象
ObjectMapper objectMapper = new ObjectMapper();
String personJson = objectMapper.writeValueAsString(person);
logger.info(personJson);
// 反序列化自定义对象
String json = "{\"name\":\"Jack\",\"profession\":[\"programmer\"],
\"birth_day\":717868800000}";
Person user = objectMapper.readValue(json, Person.class);
logger.info(user.toString());
// Deserialize json(file) --> object
String filePath = "src/main/java/jackson/jsons/persons.json";
user = objectMapper.readValue(new File(filePath), Person.class);
logger.info(user.toString());
// Deserialize json(file) --> map
@SuppressWarnings("unchecked")
Map<String, Object> data = objectMapper.readValue(new File(filePath),
Map.class);
logger.info(data);
}