Internet 上的多个帖子都指出 Jackson 具有比 GSON 更好的解析性能,速度提高了大约 20-30%。
- http://rick-hightower.blogspot.com/2014/04/new-json-serialization-benchmark.html
- http://tuhrig.de/jaxb-vs-gson-and-jackson/
- http://java.dzone.com/articles/be-lazy-productive-android
取出我们的 GSON 解析器并替换为 Jackson 导致我的项目减速 7 倍,每次调用的延迟超过 300 毫秒。 GSON 上的相同解析作业耗时不到 50 毫秒。
我浏览了 Jackson Wiki 上的“陷阱”列表,但没有什么值得警惕的地方。
例如,我没有重新创建我的 ObjectMapper
,而是使用 ObjectReader
来读取所有 JSON。这是一些示例代码:
public class JsonParser {
@Nonnull
private final ObjectMapper objectMapper;
public JsonParser() {
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(DateFormatUtil.getGmtIso8601DateFormat());
SimpleModule simpleModule = new SimpleModule();
objectMapper.registerModule(simpleModule);
this.objectMapper = objectMapper;
}
public <T> T fromJson(InputStream inputStream, Class<T> clazz) throws IOException {
ObjectReader reader = objectMapper.reader(clazz);
return reader.readValue(inputStream);
}
}
上面的对象创建一次,并在应用运行期间用于将 JSON 转换为 POJO。示例 POJO 可以在这里看到:
@JsonSerialize(include= Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ActivityEntity {
public ActivityObjectEntity actor;
public ActivityObjectEntity object;
public ActivityObjectEntity provider;
public ActivityObjectEntity target;
public ActivityObjectEntity generator;
public String content;
public String title;
public String verb;
public String url;
public Date published;
public Date updated;
// other properties omitted ...
}
正在序列化的实际上是上面的项目的列表。
这是我每次运行的示例跟踪 View 窗口。请注意,这不是异常。我始终从 Gson 和 Jackson 解析相同的数据集得到相同的性能顺序。
与 Jackson 2.4.2 和 Gson 2.2.4 的比较
最佳答案
代码看起来是正确的,即使在最坏的情况下,Jackson 也应该不比 Gson 慢;当然不是任何事物的倍数。
如果您能够获取调用堆栈的探查器快照(连续运行反序列化 10 秒以上),这可能会指出花费了过多时间的地方,并有助于找出罪魁祸首。
我仍然会仔细检查 JsonParser
是否在无意中多次构造:一个棘手的情况是例如通过像 Jersey 这样的框架(直接或通过 DropWizard)可能会多次构造资源,除非被告知构造和使用单例实例。
我之所以这样说,是因为症状恰好符合这种情况,而不是因为我怀疑你没有尽职调查。
关于android - jackson JSON 解析器性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261228/