【问题标题】:Spring JsonView unnest nested fieldsSpring JsonView 未嵌套的嵌套字段
【发布时间】:2016-01-12 13:38:00
【问题描述】:

我有类似这两个类的东西:

public class User {
    @JsonView(UserView.IdOnly.class)
    int userID;

    String name;
}

public class Project {
    @JsonView(ProjectView.IdOnly.class)
    int projectID;

    @JsonView(ProjectView.Summary.class)
    // JPA annotations ommitted
    User user;
}

以及以下视图类:

public class UserView extends View {}

public class ProjectView extends View {
    public interface Summary extends IdOnly {}
}

public class View {
    public interface IdOnly {}
}

我的控制器如下:

@JsonView(ProjectView.Summary.class)
@RequestMapping(value="/project/", method = RequestMethod.GET)
public List getProjects() {
    return repository.findAll();
}

如您所见,JSON 输出将 userID 包装在 User 对象中:

[
  {
    "projectID": 1,
    "user": {
      "userID": 1
    }
  }
]

这按预期工作,我可以让我的客户使用它,但它似乎还没有完成......我想摆脱“用户”包装器:

[
  {
    "projectID": 1,
    "userID": 1
  }
]

有没有办法干净地做到这一点?最好使用另一个注释。我还没有任何自定义序列化程序,我不想不得不开始使用它们。如果 JsonViews 无法做到这一点,是否有替代方案?

我知道一种解决方案是向 Project 类添加一个 userID 字段,但 setter 需要调用存储库(同时更新用户字段),这会弄乱我的类图。

【问题讨论】:

    标签: java json spring serialization jackson


    【解决方案1】:

    看起来有一个名为@JsonUnwrapped 的注释删除了对象包装,并且其中的所有属性都包含在父对象中。

    http://fasterxml.github.io/jackson-annotations/javadoc/2.0.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html

    希望这会有所帮助。

    【讨论】:

    • 这看起来很有希望!我看到它有一个“启用”属性,如果控制器方法标记有@JsonView,我可以将其设置为 true,否则设置为 false?
    • 根据文档,enabled 属性默认设置为 true。我认为在属性上同时使用 @JsonUnwrapped@JsonView 注释是一个问题 - https://github.com/FasterXML/jackson-databind/issues/1046。我必须进一步挖掘。真的很有趣!
    最近更新 更多