2016-01-12 54 views
1

我也有类似的这两个类的东西:春JsonView UNNEST嵌套字段

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完成,是否有其他选择?

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

回答

1

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

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

希望这会有所帮助。

+0

这看起来很有前途!我发现它有一个“启用”的属性,如果控制器方法用@JsonView标记,我可以将其设置为true,如果不是,则可以将其设置为false? – delucasvb

+0

根据文档默认情况下'enabled'属性被设置为true。我认为在属性上同时拥有'@ JsonUnwrapped'和'@ JsonView'注解是一个问题 - [https://github.com/FasterXML/jackson-databind/issues/1046](https://github.com/FasterXML /杰克逊-数据绑定/问题/ 1046)。我不得不进一步挖掘。这真的很有趣! –