尽管对象不为空,Spring仍发送空JSON

时间:2019-02-16 18:46:22

标签: json spring-boot spring-data-jpa

在我的控制器中,我具有以下方法:

    @RequestMapping(value = "/getAll", method = RequestMethod.GET)
    public List<Topic> getAllTopics() {

        List<Topic> allTopics = service.getAllTopics();

        assert allTopics.size() > 0; // is not empty
        System.out.println(allTopics.get(0)); // Topic{id=1, name='bla', description='blahhh'}

        return allTopics;
    }

当我转到http://localhost:8080/getAll时得到的结果是[{},{},{},{}],但是service.getAllTopics()返回了非空列表。因此,要发送的列表不为空,但浏览器接收到无效的JSON。但是,由于以下方法返回有效的JSON,因此序列化对象没有问题。有什么问题吗?

    @GetMapping("/json")
    public List<Locale> getLocales() {
        return Arrays.asList(DateFormat.getAvailableLocales());
    }

我正在运行最新的Spring Boot,即2.1.3.RELEASE。

更新 这是我的实体课程-主题

@Entity
@Table(name = "topic", schema="tetra")
public class Topic {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String description;

    public Topic() {
    }

    public Topic(String name, String description) {
        this.name = name;
        this.description = description;
    }

    @Override
    public String toString() {
        return "Topic{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

1 个答案:

答案 0 :(得分:1)

默认情况下,Jackson只会将公共字段和公共获取程序序列化为JSON。由于Topic既没有公共字段也没有公共getter,因此不会序列化任何内容,并且您会得到一个空的JSON对象。

有很多方法可以配置它,例如:

(1)只需为所有字段添加公共getter

(2)使用@JsonAutoDetect(fieldVisibility = Visibility.ANY)以便也可以自动检测私有字段:

@Entity
@Table(name = "topic", schema="tetra")
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class Topic {


}  

(3)使用@JsonProperty明确选择要序列化的字段/获取器。这种方法的优点是JSON中的字段名称可以不同于POJO:

@Entity
@Table(name = "topic", schema="tetra")
public class Topic {

   @JsonProperty("id")
   private Integer id;

   @JsonProperty("name")
   private String name;

   @JsonProperty("description")
   private String description;
}