常用的 JSON 处理库:
Jackson:这是最常用的库,它提供了各种特性,如生成/解析 JSON 的速度快,内存占用小,可扩展性强等。Jackson 支持类型安全,还具有复杂数据绑定的能力。
Gson:由 Google 开发,也是一个相当流行的库,使用起来非常简单。Gson 可以工作在任何 JDK 版本上,没有任何额外的依赖项。
Fastjson:这是 Alibaba 开发的 JSON库,性能好,使用起来简单。
在JavaWeb开发中,通常会使用Jackson库,因为SpringBoot已经内置了该库,不必在pom.xml中额外引入依赖。 以下代码为笔者写的Json转换工具类,使用起来比较简单方便
点击查看代码
@Slf4j
@Component
@RequiredArgsConstructor
public class JsonUtils {
private final ObjectMapper mapper;
public <T> T toObject(String json, Class<T> clazz) {
try {
return mapper.readValue(json, clazz);
} catch (IOException e) {
// 记录日志或者返回空对象
log.error(String.format("json转%s对象失败", clazz.getSimpleName()), e);
return null;
}
}
/**
* 泛型类入参
*/
public <T> T toObject(String json, TypeReference<T> type) {
try {
return mapper.readValue(json, type);
} catch (IOException e) {
// 记录日志或者返回空对象
log.error(String.format("json转%s对象失败", type.getType()), e);
return null;
}
}
public String toJson(Object object) {
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
// 记录日志或者返回空字符串
log.error(String.format("%s对象转json失败", object.getClass().getSimpleName()), e);
return "";
}
}
}
有时,对于Json中的某些属性,可能并不是我们所需要的,因此构建对应类时会忽略这些属性。若不做额外处理,用ObjectMapper转换时则会抛出异常UnrecognizedPropertyException,有以下两种处理方式:
-
在对应类上添加注解@JsonIgnoreProperties(ignoreUnknown = true)
-
在全局配置类中,给ObjectMapper做额外配置
点击查看代码
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}
第一种方式缺点:每个类遇到类似场景都需要添加注解
第二种方式缺点:有可能会出现必要属性缺失却未及时发现的情况
两种方式各有优劣,由各位自己决定吧