如何动态删除json响应中的字段?

我正在使用spring创建一个非常好的api,到目前为止一直很好,我的问题是如何动态模拟响应的字段?

那是我正在使用的控制器:

@Controller public class AlbumController { @Autowired private MusicService musicService; @RequestMapping(value = "/albums", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public Collection<Resource> getAllAlbums() { Collection albums = musicService.getAllAlbums(); List<Resource> resources = new ArrayList<Resource>(); for (Album album : albums) { resources.add(this.getAlbumResource(album)); } return resources; } @RequestMapping(value = "/album/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public Resource getAlbum(@PathVariable(value = "id") String id) { Album album = musicService.getAlbum(id); return getAlbumResource(album); } private Resource getAlbumResource(Album album) { Resource resource = new Resource(album); // Link to Album resource.add(linkTo(methodOn(AlbumController.class).getAlbum(album.getId())).withSelfRel()); // Link to Artist resource.add(linkTo(methodOn(ArtistController.class).getArtist(album.getArtist().getId())).withRel("artist")); // Option to purchase Album if (album.getStockLevel() > 0) { resource.add(linkTo(methodOn(AlbumController.class).purchaseAlbum(album.getId())).withRel("album.purchase")); } return resource; } @RequestMapping(value = "/album/purchase/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public Resource purchaseAlbum(@PathVariable(value = "id") String id) { Album a = musicService.getAlbum(id); a.setStockLevel(a.getStockLevel() - 1); Resource resource = new Resource(a); resource.add(linkTo(methodOn(AlbumController.class).getAlbum(id)).withSelfRel()); return resource; } } 

而型号:

 public class Album { private final String id; private final String title; private final Artist artist; private int stockLevel; public Album(final String id, final String title, final Artist artist, int stockLevel) { this.id = id; this.title = title; this.artist = artist; this.stockLevel = stockLevel; } public String getId() { return id; } public String getTitle() { return title; } public Artist getArtist() { return artist; } public int getStockLevel() { return stockLevel; } public void setStockLevel(int stockLevel) { this.stockLevel = stockLevel; } } 

我也在努力解决这个问题。

以下代码是使用@beerbajay在您的问题的评论中提到的JsonViews的变通方法:

http://wiki.fasterxml.com/JacksonJsonViews

我正在使用Spring Boot 1.2.3。

Views.java

 package demo; public class Views { static interface Public {} static interface Internal extends Public {} } 

Album.java

 package demo; import com.fasterxml.jackson.annotation.JsonView; public class Album { @JsonView(Views.Public.class) private String id; @JsonView(Views.Public.class) private String title; @JsonView(Views.Public.class) private String artist; @JsonView(Views.Internal.class) private String secret; public Album(String id, String title, String artist, String secret) { this.id = id; this.title = title; this.artist = artist; this.secret = secret; } } 

AlbumController.java

 package demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; @RestController public class AlbumController { @Autowired ObjectMapper mapper; @RequestMapping(value = "/album", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public String getAlbum() throws JsonProcessingException { Album foo = new Album("1", "foo", "John Doe", "secretProperty"); // replace the following value with runtime logic of your choice, // eg role of a user boolean forInternal = false; ObjectWriter viewWriter; if (forInternal) { viewWriter = mapper.writerWithView(Views.Internal.class); } else { viewWriter = mapper.writerWithView(Views.Public.class); } return viewWriter.writeValueAsString(foo); } } 

所以关键是使用jackson的ObjectMapper和ObjectWriter来生成对象的json表示的字符串

感觉有点难看,但是很有效。 当然,问题仍然是如何在定义多个RequestMapping时进行扩展。