Maven依赖
<!--Json相关-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.15.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.15.1</version>
</dependency>
<!--new ObjectMapper()-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.1</version>
</dependency>
<!-- 引入第三方组件对JSON做验证, 调用JsonSanitizer.sanitize()进行校验,防止JSON注入-->
<dependency>
<groupId>com.mikesamuel</groupId>
<artifactId>json-sanitizer</artifactId>
<version>1.2.3</version>
</dependency>
<!-- GSON-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
引入第三方组件对 JSON 做验证, 调用 JsonSanitizer.sanitize() 进行校验
序列化(jackson Java Object to JSON)
常用用法
public static <T> String toJson(T object) {
ObjectMapper objectMapper = new ObjectMapper();
String jsonStr = null;
try {
jsonStr = objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
log.info("occur error:{}", e.getMessage());
}
return jsonStr;
}
使用:
String json = JsonUtils.toJson(person); :{"id":1,"name":"name","age":18,"nickName":null}
String json = JsonUtils.toJson(map);:{"name":"name","id":1,"age":18}
定制化用法:例如过滤值为null的,属性使用蛇形命名
public static <T> String toJsonNonNullSnake(T object) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
String jsonStr = null;
try {
jsonStr = objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
log.info("occur error:{}", e.getMessage());
}
return jsonStr;
}
使用:
String json = JsonUtils.toJsonNonNullSnake(person);:{"id":1,"name":"name","nick_name":"nickName"}
String json = JsonUtils.toJsonNonNullSnake(map);:{"id":1,"name":"name","nick_name":"nickName"}
转成Json串后写入文件
// toJson 然后写入文件里
public static <T> void toJsonFile(T object) {
ObjectMapper objectMapper = new ObjectMapper();
try {
// 前提文件必须存在,其次是文件内容全覆盖的方式写入
objectMapper.writeValue(new File("D:/output/car.json"), object);
} catch (IOException e) {
log.info("occur error:{}", e.getMessage());
}
}
序列化(Gson Java Object to JSON)
可定制化用法
public static <T> String toJson2(T object) {
Gson gson = new GsonBuilder()
.setLenient()// json宽松,来忽略一些不标准的 JSON 数据格式
.enableComplexMapKeySerialization()//支持Map的key为复杂对象的形式
.serializeNulls() //智能null
.setPrettyPrinting() // 美化格式
.disableHtmlEscaping() //默认是GSON把HTML转义的
.create();
return gson.toJson(object);
}
使用:
String json = JsonUtils.toJsonG(person);:{"id":1,"name":"name","age":null,"nickName":"nickName"}
String json = JsonUtils.toJsonG(map);:{"name":"name","id":1,"age":18}
反序列化(jackson Json to Java Object)
常用用法
/**
* 将JSON字符串转换为指定类型的对象
*
* @param jsonStr 需要转换的JSON格式字符串
* @param clazz 目标类型对应的Class对象
* @param <T> 泛型参数,表示目标类型
* @return 转换成功返回对应类型的实例,若jsonStr为空或转换失败,则返回null
*/
public static <T> T jsonToT(String jsonStr, Class<T> clazz) {
if (StringUtils.isBlank(jsonStr)) {
return null;
}
ObjectMapper objectMapper = new ObjectMapper();
try {
// 使用JsonSanitizer对JSON字符串进行处理后,再进行反序列化
return objectMapper.readValue(JsonSanitizer.sanitize(jsonStr), clazz);
} catch (JsonProcessingException e) {
// 记录更详细的日志信息
log.error("JSON processing error: {}", e.getClass().getName());
log.error("JSON String: {}", jsonStr);
log.error("Error Message: {}", e.getMessage());
return null;
}
}
Person person = JsonUtils.jsonToT(json, Person.class);
结果: JsonUtilsTest.Person(id=1, name=name, age=18, nickName=null)
Map map = JsonUtils.jsonToT(json, Map.class);
结果: {id=1, name=name, age=18}
定制化用法
public static <T> T jsonToTNonNullSnake(String json, Class<T> clazz) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 跳过Json里不认识字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // JSON串里值为null的属性不处理
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); // 识别JSON里的蛇形命名的属性
T t = null;
try {
t = objectMapper.readValue(JsonSanitizer.sanitize(json), clazz);
} catch (JsonProcessingException e) {
log.info("occur error:{}", e.getMessage());
}
return t;
}
Person person = JsonUtils.jsonToTNonNullSnake(json, Person.class); : JsonUtilsTest.Person(id=1, name=name, age=null, nickName=nickName)
读取json文件到Java Object
public static <T> T jsonFileToT(Class<T> clazz) {
ObjectMapper objectMapper = new ObjectMapper();
T t = null;
try {
t = objectMapper.readValue(new URL("file:D:/output/car.json"), clazz);
t = objectMapper.readValue(new File("file:D:/output/car.json"), clazz);
} catch (IOException e) {
log.info("occur error:{}", e.getMessage());
}
return t;
结果都为:
URL : JsonUtilsTest.Person(id=1, name=name, age=18, nickName=null)
File : JsonUtilsTest.Person(id=1, name=name, age=18, nickName=null)
jackson json to JsonNode
public static JsonNode jsonToJsonNode(String json) {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = null;
try {
jsonNode = objectMapper.readTree(json);
} catch (JsonProcessingException e) {
log.info("occur error:{}", e.getMessage());
}
return jsonNode;
}
Map<String, List<String>> map = new HashMap<>();
map.put("name", Arrays.asList("name1", "name2", "name3"));
map.put("age", Arrays.asList("11", "23", "23"));
map.put("num", Arrays.asList("123", "234", "345"));
String json1 = JsonUtils.toJson(map);
JsonNode jsonNode = JsonUtils.jsonToJsonNode(JsonUtils.toJson(map));
JsonNode list = jsonNode.get("name");
JsonNode str = list.get(0);
结果:
{"num":["123","234","345"],"name":["name1","name2","name3"],"age":["11","23","23"]}
["name1","name2","name3"]
"name1"
jackson Json to List:实现方式1
// json to List
public static <T> List<T> jsonToList(String json, Class<T> clazz) {
ObjectMapper objectMapper = new ObjectMapper();
List<T> list = new ArrayList<>();
try {
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, clazz);
list.add(objectMapper.readValue(JsonSanitizer.sanitize(json), javaType));
} catch (JsonProcessingException e) {
log.info("occur error:{}", e.getMessage());
}
return list;
}
List<Person> people = JsonUtils.jsonToList(json, Person.class);
//Json
{"id":1,"name":"name1","age":13,"nickName":"nickName"},{"id":2,"name":"name2","age":14,"nickName":"nickName2"}
//json to List<Person>
[[JsonUtilsTest.Person(id=1, name=name1, age=13, nickName=nickName), JsonUtilsTest.Person(id=2, name=name2, age=14, nickName=nickName2)]]
jackson Json to List:实现方式2
public static <T> List<T> jsonToList2(String json) {
ObjectMapper objectMapper = new ObjectMapper();
List<T> list = new ArrayList<>();
try {
list = objectMapper.readValue(json, new TypeReference<List<T>>() {});
} catch (JsonProcessingException e) {
log.info("occur error:{}", e.getMessage());
}
return list;
}
List<Person> people = JsonUtils.jsonToList2(json);
//Json
[{"id":1,"name":"name1","age":13,"nickName":"nickName"},{"id":2,"name":"name2","age":14,"nickName":"nickName2"}]
//json to List<Person>
[{id=1, name=name1, age=13, nickName=nickName}, {id=2, name=name2, age=14, nickName=nickName2}]
jackson Json to Map
public static Map<String, Object> jsonToMap(String json) {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> map = new HashMap();
try {
map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});
} catch (JsonProcessingException e) {
log.info("occur error:{}", e.getMessage());
}
return map;
}
Map<String, Object> people = JsonUtils.jsonToMap(json);
//Json
{"num":"num1","name":"name1","age":"age1"}
//json to Map<String, Object>
{num=num1, name=name1, age=age1}
反序列化(Gson Json to Java Object)
定制化用法
public static <T> T jsonToTG(String json, Class<T> clazz) {
Gson gson = new GsonBuilder()
.setLenient()// json宽松
.enableComplexMapKeySerialization()//支持Map的key为复杂对象的形式
.serializeNulls() //智能null
.setPrettyPrinting()// 美化格式
.disableHtmlEscaping() //默认是GSON把HTML转义的
.create();
return gson.fromJson(Normalizer.normalize(JsonSanitizer.sanitize(json), Normalizer.Form.NFC), clazz);
}
Person person = JsonUtils.jsonToTG(json, Person.class); : JsonUtilsTest.Person(id=1, name=name, age=null, nickName=null)