Jackson反序列化convertValue vs readValue

问题描述 投票:0回答:2

我有一个包含 JSONObjects 的 org.json.JSONArray,我正在尝试将它们映射到 POJO。我知道我想要映射到的 POJO 的类型。我有 2 个选项,我想找出哪个在性能上更好。

选项一:

ObjectMapper mapper = new ObjectMapper();
ObjectReader reader = mapper.reader().withType(MyPojo.class);

for (int i = 0; i < jsonArr.length(); i++) {
    JSONObject obj = jsonArr.getJSONObject(i);
    MyPojo pojo = reader.readValue(obj.toString());

    ... other code dealing with pojo...
}

选项2:

ObjectReader mapper = new ObjectMapper();

for (int i = 0; i < jsonArr.length(); i++) {
    JSONObject obj = jsonArr.getJSONObject(i);
    MyPojo pojo = mapper.convertvalue(obj, MyPojo.class);

    ... other code dealing with pojo...
}

为了论证,假设 JSONArray 的长度为 100。

从我目前从源代码中看到的情况来看,选项 1 似乎更好,因为反序列化上下文和反序列化器只创建一次,而在选项 2 的情况下,每次调用都会完成。

想法?

谢谢!

java serialization jackson deserialization json-deserialization
2个回答
2
投票

我会尝试用我遇到的问题来解释不同之处。我在需要使用的复杂转换中同时使用了两者。

我的请求格式如下。

"{Key=a1, type=ABC}"

我想将它转换为某个类的 (A1) 实例。

class A1 {
   private String key;
   private String type;
}

很明显,键不是字符串(即没有用双引号引起来)

With mapper.readValue

我会得到如下错误:

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('k' (code 115)): was expecting double-quote to start field name

使用 mapper.convertValue

我将根据需要获取 A1 的实例。


0
投票

很简单

  • 要将 json 字符串转换为类类型,请使用 readValue
  • 要将对象类型转换为类类型,请使用 convertValue

打印时,对象看起来像这样 SampleClass(id=61, applicationReference=AP251, accountId=fghsdjffhhjf)

在打印时,jsonString a 看起来像这样 {“方法”:“POST”,“网址”}

© www.soinside.com 2019 - 2024. All rights reserved.