Как изменить формат Json? - PullRequest
0 голосов
/ 13 июня 2019

Я хочу изменить формат отображения 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;
    }
}

Кур У меня есть класс POJO ...

Для findBookByISBN(9780226285108) json answerear is

{
            "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 ]

1 голос
/ 13 июня 2019

Вы можете использовать объект передачи данных (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;
}

Таким образом, вы можете отправлять только необходимые данные в forntend.

0 голосов
/ 13 июня 2019

Если вы не хотите создавать дополнительный класс 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);
    }
0 голосов
/ 13 июня 2019

Вы можете использовать маршаллинг вашего класса Item в JSON в определенном формате.Это даст вам именно то, что вы хотите.Вы найдете способы сделать это в Spring Boot на Google.

0 голосов
/ 13 июня 2019

Создайте новый POJO для ожидаемого ответа и в своем классе BookService (не возвращайте элемент напрямую) установите свойство и верните.

В качестве альтернативы, создайте новый объект Item и задайте только обязательное свойство и возврат, при условии, что вы используете Jackson Api для таких функций, как @JsonInclude (Include.NON_NULL) и @JsonPropertyOrder.

0 голосов
/ 13 июня 2019

создайте интерфейс с получателями обязательных полей и приведите исходный объект к новому интерфейсу. Когда вы сериализуете этот объект, он даст требуемый результат. например,

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"}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...