我想更改显示Json的格式。
我试图打印整个Item对象,它正在打印所有属性(看起来很正常)。我试图更改控制器和服务以返回String,并且试图操纵String,但这不是解决我认为的问题的好方法。一定是更好的东西。
{
"requestedUrl":"https://www.googleapis.com/books/v1/volumes?q=java&maxResults=40",
"items":[
{
"id":"-SYM4PW-YAgC",
"volumeInfo":{
"title":"The Religion of Java",
"authors":[
"Clifford Geertz"
],
"industryIdentifiers":[
{
"type":"ISBN_10",
"identifier":"0226285103"
},
{
"type":"ISBN_13",
"identifier":"9780226285108"
}
],
"readingModes":{
"text":true,
"image":true
},
"pageCount":392,
"printType":"BOOK",
"categories":[
"Religion"
]
}
}
]
}
BookController.java
@CrossOrigin
@RestController
@RequestMapping("/")
public class BookController {
private BookService service;
public BookController(BookService service) {
this.service = service;
}
@GetMapping("book/{isbn}")
public Item getBook(@PathVariable String isbn) {
return service.findBookByISBN(isbn);
}
}
BookService.java
public class BookService {
public BookService() throws IOException {
}
public Item findBookByISBN(String isbn) {
// listOfItems taking json file from json file and making List<Item> to itarate over
for (Item item : listOfItems) {
if (item.getVolumeInfo().getIndustryIdentifiers().get(0).getIdentifier().equals(isbn)) {
return item;
}
}
return null;
}
}
在Cours中,我有POJO课...
对于findBookByISBN(9780226285108)
json answear是
{
"title":"The Religion of Java",
"authors":[
"Clifford Geertz"
],
"industryIdentifiers":[
{
"type":"ISBN_10",
"identifier":"0226285103"
},
{
"type":"ISBN_13",
"identifier":"9780226285108"
}
],
"readingModes":{
"text":true,
"image":true
},
"pageCount":392,
"printType":"BOOK",
"categories":[
"Religion"
]
}
但是我想使我的json像这样:
{
"title":"The Religion of Java",
"printType":"BOOK",
"pageCount":392,
"authors":[
"Clifford Geertz"
],
"categories":[
"Religion"
]
}
答案 0 :(得分:1)
您可以使用数据传输对象(DTO)并仅发送所需的信息作为响应。
{
"title":"The Religion of Java",
"printType":"BOOK",
"pageCount":392,
"authors":[
"Clifford Geertz"
],
"categories":[
"Religion"
]
}
在这种情况下,您可以编写
之类的DTO。 class NameYouWant{
String title;
String printType;
Integer pageCount;
List<String> authors = new ArrayList<>();
List<String> categories = new ArrayList<>();
//generate getters and setters of the above data members.
}
现在,当您发送响应时,请像下面这样在dto中设置数据: 创建对象
public Item findBookByISBN(String isbn) {
for (Item item : listOfItems) {
if (item.getVolumeInfo().getIndustryIdentifiers().get(0).getIdentifier().equals(isbn)) {
NameYouWant na = new NameYouWant();
na.setTitle(item.getTitle());
na.setPrintType(item.getPrintType());
na.setPageCount(item.getPageCount());
na.SetAuthors(item.getAuthors());
na.SetCategories(item.getCategories());
return na;
}
}
return null;
}
通过这种方式,您只能在前端发送所需的数据。
答案 1 :(得分:0)
使用必填字段的Getter创建一个接口,并将原始对象转换为新的Interface。序列化此对象时,它将产生所需的结果。 例如
class Body implements BriefBody {
String content;
String type;
// ---Getters/Setters---
}
interface BriefBody {
String getContent();
}
BriefBody getBriefBody() {
Body body = new Body();
body.setContent("bodyContent");
body.setType("bodyType");
return body;
}
结果将包含{“ content”:“ bodyContent”}。
答案 2 :(得分:0)
为您的预期响应创建一个新的POJO,并在BookService类(不直接返回项目)中设置属性并返回。
或者,假设您使用Jackson Api来实现@JsonInclude(Include.NON_NULL)和@JsonPropertyOrder之类的功能,则创建一个新的Item Object并仅设置所需的属性并返回。
答案 3 :(得分:0)
您可以使用将某些XML格式的Item类编组为JSON的方法。那会给你你想要的。您将在Google的Spring Boot中找到实现此目的的方法。
答案 4 :(得分:0)
如果您不想创建其他DTO类或具有许多不同的视图,则可以在类字段上使用Jackson @JsonView注释。示例:
1)创建课程:
public class View {
public static class UI {}
public static class NotUI {}
public static class Rest {}
}
//您可以在此处创建许多不同的视图;
2)注释您实体的必填字段;
class Book{
String title;
String printType;
@JsonView(View.Rest.class)
Integer pageCount;
// pageCount具有“ Rest”视图,而控制器具有“ UI”视图-pageCount将丢失
3)在适当的上下文中注释控制器方法:
@JsonView(View.UI.class)
@GetMapping("book/{isbn}")
public Item getBook(@PathVariable String isbn) {
return service.findBookByISBN(isbn);
}