【问题标题】:How spring boot serialized objectsspring boot如何序列化对象
【发布时间】:2018-06-17 12:25:21
【问题描述】:

我有一个对象:

public class MoQueryData {
private Map<String,Map<String,MoQuery>> data;

public MoQueryData() {
    data = new HashMap<>();
}

public MoQueryData(Map<String, Map<String, MoQuery>> data) {
    this.data = data;
}

public Map<String, Map<String, MoQuery>> getData() {
    return data;
}

public List<MoQuery> getDataForAllVendors() {
    return data.values().stream().flatMap(l -> l.values().stream()).collect(Collectors.toList());
}

}

像这样在控制器中使用它:

@RequestMapping(method = RequestMethod.GET ,value = "/queries/")
public MoQueryData getMoQueriesData() {
    return moQuery.getData();
}

我们得到以下json

 {
    "data": {....},
    "dataForAllVendors": [....]
   }

我不明白为什么要调用 getDataForAllVendors? 使用@JsonIgnore 它不会发生,但我仍然试图了解幕后发生的事情。

【问题讨论】:

  • 反序列化不是由spring完成的,而是由JSON框架完成的,例如Jackson。如果我不得不猜测,我会说它默认使用所有 public 方法进行反序列化。如果我没记错的话,Jackson 有一些检测 getter 的逻辑,但是由于您的 getDataForAllVendrs()-method 不符合他们的方案,因此它被视为单独的属性。

标签: java spring-boot jackson


【解决方案1】:

由于您的类getDataForAllVendors() 中有类似getter 的命名方法,您将获得dataForAllVendors 字段。默认情况下,Jackson 会发现并序列化所有可访问的字段,因此也会发现您类中的 getter 命名方法。重命名此方法或将其标记为忽略将阻止序列化。

【讨论】:

  • 花了几个小时试图找出我的代码出了什么问题。救了我一命。谢谢
【解决方案2】:

@Sebastian Brudzinski 提供的答案是正确答案。但是,他没有解释如何将方法标记为已忽略。为此,请使用注释 @JsonIgnore 标记您的方法,将您的属性或 getter 方法标记为将被 Jackson-JSON 序列化忽略的方法。所以只是为了总结答案 - 更改方法使其看起来不像 getter(比如将其重命名为 retrieveDataForAllVendors())或用注释标记它 @JsonIgnore 将解决您的问题

【讨论】:

  • 这是作为评论的有用信息,从而使 OP 或任何具有编辑权限的人可以改进接受的答案。它没有任何新内容可以作为答案发布。
猜你喜欢
  • 2018-11-17
  • 2019-05-10
  • 2019-02-01
  • 2018-04-08
  • 2021-06-08
  • 1970-01-01
  • 2021-02-18
  • 2020-02-02
  • 1970-01-01
相关资源
最近更新 更多