Java中如何缓存objectMapper.readValue方法的调用结果
缓存JSON解析结果的实现方案
核心思路
objectMapper.readValue的入参是JSON字符串,出参是ObjectNode对象,所以直接用JSON字符串作为缓存key,解析得到的ObjectNode作为缓存value即可。
可选实现方式
- 本地场景优先用Caffeine/Guava Cache做内存缓存,适合单服务实例内的解析结果复用,性能最高
- 多实例共享场景可选用Redis等分布式缓存,需要额外处理
ObjectNode的序列化逻辑
代码示例(基于Caffeine本地缓存)
首先全局初始化缓存实例,参数可根据业务实际调整:
private final LoadingCache<String, ObjectNode> jsonNodeCache = Caffeine.newBuilder() .maximumSize(1000) // 最大缓存1000条,避免内存溢出 .expireAfterAccess(5, TimeUnit.MINUTES) // 5分钟未访问自动淘汰 .build(key -> objectMapper.readValue(key, ObjectNode.class));
改造原有业务逻辑:
public String getPropertyFromJson(String json, String property) { if (json == null) { return null; } String propertyValue = null; // 先查缓存,未命中会自动执行解析逻辑并存入缓存 final ObjectNode node = jsonNodeCache.get(json); if (node.has(property)) { propertyValue = node.get(property).textValue(); } return propertyValue; }
注意事项
- 若业务代码后续会修改返回的
ObjectNode,请缓存ObjectNode的深拷贝副本,避免脏写污染缓存数据 - 要根据JSON字符串的平均大小、访问频率调整缓存的最大容量和过期策略,防止占用过多内存
- 解析异常会默认直接抛出,可根据业务需要在缓存的build逻辑中添加异常捕获处理
内容的提问来源于stack exchange,提问作者getzels
相关产品推荐
相关产品推荐

