如何使用Jackson反序列化具有可选字段的类的json

4

我正在使用 Jackson 来反序列化一个具有 Optional 成员变量的类,代码如下:

class Test{
   Optional<String> testString;
}

但是在序列化的形式中,它看起来像这样,这是合法的。
{
"value": {
"testString": "hi"
}

如何将其反序列化回我的Test类?因为当我尝试这样做时,它会显示未知字段“value”。是否可以在不更改我的测试类的情况下实现呢?


1
可能相关的链接,以更好地理解为什么不应该首选Optional作为字段类型。 - Naman
@nullpointer,这是有效的,但我正在使用的类来自第三方库。 - Siddharth Thakrey
1个回答

2
你需要注册Jdk8Module。以下是示例,说明如何做到这一点:

您需要注册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]}

See also:

  1. jackson-modules-java8

在你的情况下,你正在创建一个新对象,但在我的情况下,我正在尝试反序列化从文件中读取的 JSON {"value": {"testString": "hi"}}。 - Siddharth Thakrey
当您启用Jdk8Module并序列化您的Test对象时,它将像我的示例一样。因此,反序列化将开始工作而无需任何更改。如果您想保留带有根对象中的“值”的旧版本JSON,则需要更新POJO结构。您可以更改JSON吗?如果可以,请使用Jdk8Module重新生成它。如果不行,则需要更改POJO结构。您使用哪个版本的Jackson?您使用FasterXML还是codehaus - Michał Ziober
@SiddharthThakrey,你解决了你的问题吗? - Michał Ziober
在我的情况下,API 在没有使用 Jdk8Module 的情况下序列化响应,它看起来像这样: { "present": true "value"{ "testString": "abc" }} 我正在尝试反序列化上述形式的 TestClass,因为这是第三方 API 的响应。 - Siddharth Thakrey
@SiddharthThakrey,当我尝试序列化private Optional<String> testString = Optional.of("Test")时,结果是:{"testString":{"present":true}}。你使用了自定义的序列化器吗?在你的情况下,testStringvalue中,这很奇怪。它应该是这样的:{"testString": {"present": true,"value": "abc"}}。在你的情况下,无法将JSON属性与Test类的testString属性匹配。 - Michał Ziober
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接