【发布时间】:2019-12-31 09:16:24
【问题描述】:
总结
我想在下面描述的用例上下文中找到在线程安全和性能方面使用ObjectMapper 和/或ObjectReader 的最佳实践。
背景
我有一个辅助类 (Json.java),其中方法 toObject() 使用 ObjectMapper 将 json 字符串转换为给定 (json-mappable) 类的对象.
问题/疑问
我读到ObjectReader 通常被推荐为完全线程安全的,但我主要看到它在一个非泛型上下文中,其中要读取的类是预定义的。在这种情况下,您认为在线程安全和性能方面的最佳实践是什么?在代码中,我有三个建议可以作为起点。
我试图查看jackson-databind 的源代码和文档,但我的理论Java 技能不足以从中得出答案。我还查看了关于 SO 和其他地方的类似问题,但没有发现任何与我的情况足够接近的问题。
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
public abstract class Json {
private static final ObjectMapper jsonMapper = new ObjectMapper();
// NOTE: jsonReader is only relevant for Suggestion 3.
private static final ObjectReader jsonReader = jsonMapper.reader();
// Suggestion 1:
public static <T> T toObject1(final Class<T> type, final String json) throws IOException {
return jsonMapper.readValue(json, type);
}
// Suggestion 2:
public static <T> T toObject2(final Class<T> type, final String json) throws IOException {
return jsonMapper.readerFor(type).readValue(json);
}
// Suggestion 3:
public static <T> T toObject3(final Class<T> type, final String json) throws IOException {
return jsonReader.forType(type).readValue(json);
}
// Remainder of class omitted for brevity.
}
【问题讨论】:
-
我一直使用建议#1。这让映射器可以找出执行反序列化的最佳方式
-
@SharonBenAsher 为什么?它有什么不同?
标签: java json performance thread-safety jackson-databind