使用 Jackson Object Mapper 将 Map 转换为 Java 对象非常慢

Posted

技术标签:

【中文标题】使用 Jackson Object Mapper 将 Map 转换为 Java 对象非常慢【英文标题】:Converting Map to Java object using Jackson Object Mapper is very slow 【发布时间】:2017-07-22 08:50:00 【问题描述】:

我目前正在尝试使用 Jackson 数据绑定库从 Map 创建 52 个 Java 对象,目前转换所有 52 个对象总共需要 3.518 秒,这似乎很慢。我不确定为什么会这样。这是异常情况还是可以采取一些措施来加快这些转换?

这是我的 Java 对象类:

public class MoodDatapoint extends DocumentModelHelper 

    @JsonProperty(value = "happiness")
    private int happiness;

    @JsonProperty(value = "stress")
    private int stress;

    @JsonProperty(value = "pain")
    private int pain;

    @JsonProperty(value = "timestamp")
    private long timestamp;

    @JsonProperty(value = "lat")
    private double lat;

    @JsonProperty(value = "lng")
    private double lng;

    @JsonProperty(value = "comment")
    private String comment;

    @JsonProperty(value = "event_name")
    private String eventName;

    @JsonProperty(value = "is_before")
    private boolean isBefore;

    @JsonProperty(value = "related_event_id")
    private String relatedEventID;

这是我试图转换为类的地图:

    
    stress=0, 

    pain=0, 

    happiness=10, 

    timestamp=1488464269384, 

    is_before=false, 

    lng=-79.6208645, 

    event_name=null, 

    comment=, 

    lat=43.6462939,

    related_event_id=null

以及我将 Map 转换为对象的代码:

ObjectMapper m = new ObjectMapper();

MoodDatapoint datapoint = m.convertValue(map, MoodDatapoint.class);

使用logcat计算每次对象转换的持续时间,看来每次转换平均需要62毫秒:

...
D/M DATAPOINT CONVERSION DURATION: 68
D/M DATAPOINT CONVERSION DURATION: 45
D/TOTAL DURATION (S): 3550
D/AVG DURATION: 68
D/Total objects: 

【问题讨论】:

您只是指出这一点还是对此有疑问? 您能发布更多代码吗?看来您正在为每次转换创建一个 ObjectMapper ......这确实很慢。 @Okas 这实际上是问题所在!我现在正在使用 ObjectMapper 的单个实例,并且在同一操作中我已经从 3500+ 毫秒变为 52 毫秒。谢谢。 【参考方案1】:

不要为每次转换创建 ObjectMapper,而是创建一个实例并将其用于所有转换。 ObjectMapper 创建是一项非常昂贵的操作。

【讨论】:

以上是关于使用 Jackson Object Mapper 将 Map 转换为 Java 对象非常慢的主要内容,如果未能解决你的问题,请参考以下文章

来自MongoDB BSON的Jackson ObjectMapper

导入 Jackson-Core-1.x.x 和 Jackson-Mapper-1.x.x 时,我在打包 APK 错误时收到重复文件

使用 Jackson JSON Mapper 在 JSON 到 POJO 之间映射时出现 400 Bad Request

Jackson的使用

Jackson XML Mapper为列表编写两次元素名称

Spring mvc jackson json mapper-如何将unicode编码应用于json响应中的特殊字符