【问题标题】:How to Deserialize json for class having Optional fields using Jackson如何使用 Jackson 反序列化具有可选字段的类的 json
【发布时间】:2019-02-15 06:19:33
【问题描述】:

我正在使用Jackson 反序列化具有Optional 成员变量的类,所以它看起来像

class Test{
   Optional<String> testString;
}

但是以序列化的形式看起来是合法的

{
"value": {
"testString": "hi"
}

如何将其反序列化回我的Test 类?因为当我尝试这样做时,它会显示未知字段“值”。不改变我的测试类是否有可能。

【问题讨论】:

  • 可能与 link 相关,并更好地理解为什么不应首选 Optional 作为字段类型。
  • @nullpointer,它有效但我使用的类来自第三方库

标签: java jackson deserialization optional


【解决方案1】:

您需要注册Jdk8Module。您可以在下面找到示例,如何做到这一点:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;

import java.io.File;
import java.util.Optional;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());

        Test test = new Test();
        test.setTestString(Optional.of("str"));

        String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(test);
        System.out.println(json);
        System.out.println(mapper.readValue(json, Test.class));
    }
}

上面的代码打印:

{
  "testString" : "str"
}
Test{testString=Optional[str]}

另见:

  1. jackson-modules-java8

【讨论】:

  • 在您的情况下,您正在创建一个新对象,但在我的情况下,我尝试反序列化正在从文件中读取的 json {“value”:{“testString”:“hi”}。
  • 当您启用Jdk8Module 并序列化您的Test 对象时,它将看起来像我的示例中所示。因此,反序列化将开始工作而无需任何更改。如果你想在根对象中保留旧版本的JSONvalue,你需要更新POJOs 结构。你能改变JSON吗?如果是,请使用Jdk8Module 重新生成它。如果不是,则需要更改POJO 结构。您使用哪个版本的Jackson?你用FasterXML还是codehaus
  • @SiddharthThakrey,你的问题解决了吗?
  • 在我的情况下,api 是在不使用 Jdk8Module 的情况下序列化响应,它看起来像 { "present": true "value"{ "testString": "abc" }} 并且我试图反序列化上述形式TestClass 看起来像,因为那是第三方 api 响应
  • @SiddharthThakrey,当我尝试序列化 private Optional&lt;String&gt; testString = Optional.of("Test") 结果是:{"testString":{"present":true}} 你使用任何自定义序列化器吗?在你的情况下,testStringvalue 内部,这很奇怪。它应该类似于:{"testString": {"present": true,"value": "abc"}}。在您的情况下,无法将JSON 属性与Test 的类testString 属性匹配。
猜你喜欢
  • 1970-01-01
  • 2019-06-21
  • 2017-04-04
  • 2014-01-11
  • 2017-09-08
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2019-05-24
相关资源
最近更新 更多