gpt4 book ai didi

java - 如何从 json 响应中动态删除字段?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:37 25 4
gpt4 key购买 nike

我正在使用 spring 创建一个 restful api,到目前为止一切顺利,我的问题是如何对动态响应的字段建模?

这就是我正在使用的 Controller :

@Controller

public class AlbumController {

@Autowired
private MusicService musicService;

@RequestMapping(value = "/albums", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Collection<Resource<Album>> getAllAlbums() {

Collection<Album> albums = musicService.getAllAlbums();
List<Resource<Album>> resources = new ArrayList<Resource<Album>>();
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<Album> getAlbum(@PathVariable(value = "id") String id) {

Album album = musicService.getAlbum(id);
return getAlbumResource(album);

}

private Resource<Album> getAlbumResource(Album album) {

Resource<Album> resource = new Resource<Album>(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<Album> purchaseAlbum(@PathVariable(value = "id") String id) {

Album a = musicService.getAlbum(id);
a.setStockLevel(a.getStockLevel() - 1);
Resource<Album> resource = new Resource<Album>(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 {}
}

相册.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;
}

}

专辑 Controller .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,
// e.g. 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的ObjectMapperObjectWriter生成对象的 json 表示形式的字符串

我觉得有点难看,但有效。当然,问题仍然是定义多个 RequestMapping 时如何缩放。

关于java - 如何从 json 响应中动态删除字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29838960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com