Jackson将List <string>反序列化为POJO的属性

时间:2018-09-15 13:46:46

标签: java json spring collections jackson

我有一个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;
}
}

3 个答案:

答案 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