我正在使用 Jackson
来反序列化一个具有 Optional
成员变量的类,代码如下:
class Test{
Optional<String> testString;
}
但是在序列化的形式中,它看起来像这样,这是合法的。
{
"value": {
"testString": "hi"
}
如何将其反序列化回我的Test
类?因为当我尝试这样做时,它会显示未知字段“value”。是否可以在不更改我的测试类的情况下实现呢?
我正在使用 Jackson
来反序列化一个具有 Optional
成员变量的类,代码如下:
class Test{
Optional<String> testString;
}
{
"value": {
"testString": "hi"
}
如何将其反序列化回我的Test
类?因为当我尝试这样做时,它会显示未知字段“value”。是否可以在不更改我的测试类的情况下实现呢?
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:
Jdk8Module
并序列化您的Test
对象时,它将像我的示例一样。因此,反序列化将开始工作而无需任何更改。如果您想保留带有根对象中的“值”的旧版本JSON
,则需要更新POJO
结构。您可以更改JSON
吗?如果可以,请使用Jdk8Module
重新生成它。如果不行,则需要更改POJO
结构。您使用哪个版本的Jackson
?您使用FasterXML
还是codehaus
? - Michał Zioberprivate Optional<String> testString = Optional.of("Test")
时,结果是:{"testString":{"present":true}}
。你使用了自定义的序列化器吗?在你的情况下,testString
在value
中,这很奇怪。它应该是这样的:{"testString": {"present": true,"value": "abc"}}
。在你的情况下,无法将JSON
属性与Test
类的testString
属性匹配。 - Michał Ziober
Optional
作为字段类型。 - Naman