ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。
演示
Java对象转换为JSON对象:
public class ObjectMapperTest {
public static void main(String[] args) throws IOException {
//序列化的时候序列对象的所有属性
objectMapper.setSerializationInclusion(Include.ALWAYS);
//反序列化的时候如果多了其他属性,不抛出异常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//如果是空对象的时候,不抛异常
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
//创建实体类
Person person = new Person(1, "tom", "123");
//实体类转换为json字符串
String jsonString = objectMapper.writeValueAsString(person);
System.out.println("JsonString: " + jsonString);
//字符串转换为类
Person person1 = objectMapper.readValue(jsonString, Person.class);
System.out.println(person1.toString());
}
}
Person 类:
public class Person {
private int id;
private String name;
private String password;
public Person() {
super();
}
public Person(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
/*省略get和set方法*/
}
Java数组对象和JSON数组对象转换
public class ObjectMapperTest {
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
//Java数组转换为JSON数组
Person person = new Person(1, "tom", "123");
Person person1 = new Person(2, "jack", "123445");
List<Person> personList = new ArrayList<>();
personList.add(person);
personList.add(person1);
String jsonString = objectMapper.writeValueAsString(personList);
System.out.println("JsonString List: " + jsonString);
//Json数组转换为Java数组
//JavaType
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, Person.class);
List<Person> list = objectMapper.readValue(jsonString,javaType);
//打印出list中的值
for (Person person2 : list) {
System.out.println(person2.toString());
}
}
}
内部调用
post方法调用
public <T> String post(String url, T param) {
log.info("请求方式:POST");
log.info("请求URL:{}", url);
try {
//入参转换字符串形式
String paramSerialize = objectMapper.writeValueAsString(param);
log.info("请求参数:{}", paramSerialize);
//返回的出参
String response = OkHttp3.getInstance().post(url, paramSerialize);
log.info("请求返回数据:{}", response);
return response;
} catch (JsonProcessingException e) { // 捕获对象序列化异常
log.error(e.getMessage());
throw new ReddotServiceException(ExceptionCode.SYS_JSON_SERIALIZE_ERROE);
} catch (IOException e) {
log.error(e.getMessage());
throw new ReddotServiceException(ExceptionCode.SYS_ERROR);
}
}
get方法调用
public <T> String get(String url, T param) {
log.info("请求方式:GET");
log.info("请求URL:{}", url);
try {
log.info("请求参数:{}", objectMapper.writeValueAsString(param));
// 入参转换为Map 格式例: id(key),1(value)
Map paramMap = objectMapper.readValue(objectMapper.writeValueAsString(param), new TypeReference<Map>() {
});
String response = (param == null ? OkHttp3.getInstance().get(url) : OkHttp3.getInstance().get(url, paramMap));
log.info("请求返回数据:{}", response);
//判断返回参数是否成功
return response;
} catch (JsonProcessingException e) {
log.error(e.getMessage());
throw new ReddotServiceException(ExceptionCode.SYS_JSON_SERIALIZE_ERROE);
} catch (IOException e) {
log.error(e.getMessage());
throw new ReddotServiceException(ExceptionCode.SYS_ERROR);
}
}
传递参数的时候,就算你用的是map,那传输的时候也是json字符串,当然也可以直接试用JSON串进行传输。
大部分调用的url地址入参都能为JSON字符串形式,当然用Map也是可以的。