文章目录
- 1.ObjectMapper类的介绍:
- 1.1构造函数:
- 1.2常用的序列化设置属性:
- 2.实用方法
- 2.1.1将Json字符串---->java对象。
- 2.1.2java对象---->Json字符串
- 2.1.3json---->List集合:
- 2.1.4Json--->任意复杂类型
- 2.1.5 JSON 字符输入流-->Java对象
- 2.1.6 JSON文件-->Java对象
- 2.1.7、JSON字节输入流-->Java对象
- 2.1.8 JSON二进制数组-->Java对象
- 2.1.9 JSON字符串-->Map
- 2.2添加属性的用法:
1.ObjectMapper类的介绍:
ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。
1.1构造函数:
1.2常用的序列化设置属性:
private static ObjectMapper mapper = new ObjectMapper()
.setSerializationInclusion(Include.NON_NULL)
.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.enable(MapperFeature.USE_ANNOTATIONS);
其中:
(1) setSerializationInclusion::设置序列化配置(全局),设置序列化时不输出空值.
其中:
- Include.ALWAYS 是序列化对像所有属性
- Include.NON_NULL 只有不为null的字段才被序列化
- Include.NON_EMPTY 如果为null或者 空字符串和空集合都不会被序列化
(2)SerializationFeature.WRAP_ROOT_VALUE:是否环绕根元素,默认false,如果为true,则默认以类名作为根元素。
(3)SerializationFeature.WRITE_DATES_AS_TIMESTAMPS:序列化日期时以timestamps输出,默认true
(4)MapperFeature.USE_ANNOTATIONS 或者用注解 @JsonAutoDetect(作用在类上)来开启/禁止自动检测
2.实用方法
2.1.1将Json字符串---->java对象。
private ObjectMapper mapper = new ObjectMapper();
@Test
public void testJson() throws IOException {
User user = new User();
user.setId(8L);
user.setAge(21);
user.setName("柳岩");
user.setUserName("liuyan");
// 序列化
String json = mapper.writeValueAsString(user);
// 反序列化,接收两个参数:json数据,反序列化的目标类字节码
User result = mapper.readValue(json, User.class);
System.out.println("result = " + result);
}
2.1.2java对象---->Json字符串
private ObjectMapper mapper = new ObjectMapper();
@Test
public void testJson() throws JsonProcessingException {
User user = new User();
user.setId(8L);
user.setAge(21);
user.setName("柳岩");
user.setUserName("liuyan");
// 序列化
String json = mapper.writeValueAsString(user);
System.out.println("json = " + json);
}
2.1.3json---->List集合:
private ObjectMapper mapper = new ObjectMapper();
@Test
public void testJson() throws IOException {
User user = new User();
user.setId(8L);
user.setAge(21);
user.setName("柳岩");
user.setUserName("liuyan");
// 序列化,得到对象集合的json字符串
String json = mapper.writeValueAsString(Arrays.asList(user, user));
// 反序列化,接收两个参数:json数据,反序列化的目标类字节码
List<User> users = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, User.class));
for (User u : users) {
System.out.println("u = " + u);
}
}
2.1.4Json—>任意复杂类型
private ObjectMapper mapper = new ObjectMapper();
@Test
public void testJson() throws IOException {
User user = new User();
user.setId(8L);
user.setAge(21);
user.setName("柳岩");
user.setUserName("liuyan");
// 序列化,得到对象集合的json字符串
String json = mapper.writeValueAsString(Arrays.asList(user, user));
// 反序列化,接收两个参数:json数据,反序列化的目标类字节码
List<User> users = mapper.readValue(json, new TypeReference<List<User>>(){});
for (User u : users) {
System.out.println("u = " + u);
}
}
下面是另外两个复杂类型的例子:其中的第一个参数都是Json字符串。
Map<String,Object> genericSpecMap = MAPPER.readValue(spuDetail.getGenericSpec(), new TypeReference<Map<String, Object>>() {});
// 把特殊的规格的参数值,进行反序列化
Map<String,List<Object>> specialSpecMap = MAPPER.readValue(spuDetail.getSpecialSpec(), new TypeReference<Map<String, List<Object>>>() {});
2.1.5 JSON 字符输入流–>Java对象
还可以从通过Reader实例加载的JSON中读取对象。示例如下:
ObjectMapper objectMapper = new ObjectMapper();
String carJson =
"{ \"brand\" : \"Mercedes\", \"doors\" : 4 }";
Reader reader = new StringReader(carJson);
Car car = objectMapper.readValue(reader, Car.class);
2.1.6 JSON文件–>Java对象
从文件读取JSON当然可以通过FileReader(而不是StringReader)来完成,也可以通过File对象来完成。 这是从文件读取JSON的示例:
ObjectMapper objectMapper = new ObjectMapper();
File file = new File("data/car.json");
Car car = objectMapper.readValue(file, Car.class);
2.1.7、JSON字节输入流–>Java对象
也可以使用ObjectMapper通过InputStream从JSON读取对象。 这是一个从InputStream读取JSON的示例:
ObjectMapper objectMapper = new ObjectMapper();
InputStream input = new FileInputStream("data/car.json");
Car car = objectMapper.readValue(input, Car.class);
2.1.8 JSON二进制数组–>Java对象
Jackson还支持从JSON字节数组读取对象。 这是从JSON字节数组读取对象的示例:
ObjectMapper objectMapper = new ObjectMapper();
String carJson =
"{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
byte[] bytes = carJson.getBytes("UTF-8");
Car car = objectMapper.readValue(bytes, Car.class);
2.1.9 JSON字符串–>Map
Jackson ObjectMapper还可以从JSON字符串读取Java Map。 如果事先不知道将要解析的确切JSON结构,这种方法是很有用的。 通常,会将JSON对象读入Java Map。 JSON对象中的每个字段都将成为Java Map中的键,值对。
这是一个使用Jackson ObjectMapper从JSON字符串读取Java Map的示例:
String jsonObject = "{\"brand\":\"ford\", \"doors\":5}";
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> jsonMap = objectMapper.readValue(jsonObject,
new TypeReference<Map<String,Object>>(){});
2.2添加属性的用法:
public class Main2 {
public static void main(String[] args) throws Exception{
ObjectMapper objectMapper = new ObjectMapper();
**序列化的时候序列对象的所有属性
objectMapper.setSerializationInclusion(Include.ALWAYS);
**取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
Person person = new Person(1, "zxc", new Date());
**这是最简单的一个例子,把一个对象转换为json字符串
String personJson = objectMapper.writeValueAsString(person);
System.out.println(personJson);
**默认为true,会显示时间戳
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
personJson = objectMapper.writeValueAsString(person);
System.out.println(personJson);
}
}
结果如下: