我有一个POJO类,它将从Spring中以RequestBody
的JSON反序列化。该POJO类包含List<String>
作为实例变量。反序列化此变量时,值为null
。如何正确反序列化?下面是代码示例
我的POJO如下图所示
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class BookDto {
@JsonProperty("bookName")
private String bookName;
@JsonProperty("authors")
private List<String> authors;
@JsonProperty("description")
private String description;
}
我的JSON对象如下所示
{
"bookName":"Vagrant Up and Running",
"authors":["aone", "atwo"],
"description":"Getting started guide for Vagrant development"
}
下面是示例方法调用
public void method(@RequestBody BookDto bookDto) {}
我遵循了建议,并在下面给出了反序列化器代码
public class AuthorDeserializer extends JsonDeserializer<List<String>> {
@Override
public List<String> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
Author author = jsonParser.readValueAs(Author.class);
return author.authors;
}
private static class Author {
public List<String> authors;
}
}
答案 0 :(得分:0)
设置字段Public
或添加getter使其可反序列化
请参考this以了解更多详情
答案 1 :(得分:0)
如果您使用龙目岛,请考虑添加此注释@Data
,如下所示:
@Data //You can remove the @Getter and @Setter annotation since @Data includes them
@NoArgsConstructor
public class BookDto {
private String bookName;
private List<String> authors;
private String description;
}
注意:这与问题无关,但为清楚起见,请删除@JsonProperty()
,因为您的JSON对象的属性与DTO的属性同名,默认情况下{{1 }}使用名称来映射属性。
编辑:ObjectMapper
为您反序列化JSON,因此您无需手动进行。
答案 2 :(得分:-1)
设置器使非公共字段只能反序列化。 为所有字段添加setter方法或使用注释@Setter。 参考:Link