如何更改Json格式?

时间:2019-06-13 05:42:52

标签: java json spring spring-boot

我想更改显示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"
   ]
}

5 个答案:

答案 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);
    }