8

我正在研究由 js MVC 框架使用的球衣 REST 服务的 POC。在其中一种表单上,我需要返回 UserProfile 对象(由 Jackson 序列化为 JSON),该对象将用于预填充 HTML 表单。在提交表单时,只有一部分字段必须发送到服务器(因为像“角色”这样的一些字段是只读的,不能更改),因此输入 JSON 将被映射到 UserProfileUpdateRequest 对象。从服务器代码维护的角度来看,我想在这两个对象之间建立关系,因为 UserProfileUpdateRequest 将是 UserProfile 的子集,所以我的第一选择是使用组合:UserProfile 包含 UserProfileUpdateRequest。问题是当杰克逊将UserProfile序列化为JSON时,引用的 UserProfileRequest 实例的所有属性都将包含在 userProfileRequest 字段中——这似乎很自然,但对于 JS 人员来说是不可接受的(或者至少我被告知这是不可接受的)。有什么办法可以强制杰克逊“扁平化”根对象并指出哪些引用对象的属性必须在根目录下序列化?一个小例子

class UserProfileRequest{
private String a;
private String b;
...
}

class UserProfile{
private String role;
...
private UserProfileRequest userProfileRequest;
}

因此,当 UserProfile 被序列化时,我得到了:

{"role":"admin",...,"userProfileRequest":{"a":"...","b":"...",...}}

但想得到

{"role":"admin",...,"a":"...","b":"...",...}

我正在使用杰克逊 1.9.7。

4

1 回答 1

21

我认为您正在寻找@JsonUnwrapped注释。

class UserProfile{
    private String role;
    ...
    @JsonUnwrapped
    private UserProfileRequest userProfileRequest;
}

编辑:这是Jackson 1.9.9 中@JsonUnwrapped的链接,因此它也应该在 1.9.7 中可用。

于 2013-03-07T08:59:48.897 回答