Я пытаюсь получить четкий массив объектов (книг) JSON с помощью GSON. Но всякий раз, когда я запускаю следующий код:

public class Book {
    private int id;
    private String name;
    private String type;
    private boolean available;
    
    public Book(int id, String name, String type, boolean available) {
        super();
        this.id = id;
        this.name = name;
        this.type = type;
        this.available = available;
    }

    @Override
    public String toString() {
        return "{id=" + id + ", name=" + name + ", type=" + type + ", available=" + available + "},";
    }

    
}
import org.springframework.stereotype.Component;

import com.google.gson.Gson;

@Component
public class BookService {

    private int size = 0;
    public  int len = 6;
    public Book Allbooks[] = new Book[len];

    public Book AddBook(int id, String name, String type, boolean available) {
        if(id == len)
            return null;
        this.size++;
        return Allbooks[this.size - 1] = createBook(id, name, type, available);


    }
    private Book createBook(int id, String name, String type, boolean available) {
        return new Book(id, name, type, available);
    }
    public Book[] bookRepo() {
        
        Allbooks[0] = AddBook(1, "One", "fiction", false);
        Allbooks[1] = AddBook(2, "Two", "non-fiction", true);
        Allbooks[2] = AddBook(3, "Three", "fiction", true);
        Allbooks[3] = AddBook(4, "Four", "fiction", false);
        Allbooks[4] = AddBook(5, "Five", "non-fiction", true);
        Allbooks[5] = AddBook(6, "Six", "non-fiction", true);

        return Allbooks;
    }
    public String[] showAll() {
        String[] arr = new String[Allbooks.length];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new Gson().toJson(Allbooks[i], Book.class);
        }return arr;

    }
}
@RestController
class ControllerGET {

    @Autowired Status status;
    @Autowired BookService bookRepository;

    @GetMapping(path = {"/", ""})
    public String mainPage() {
        return "Welcome to Mile's simple book-API";
    }
    @GetMapping(path = "/status")
    public Status getStatus() {
        status.value = "OK";
        return status;
    }
    @GetMapping(path = "/books")
    public String[] getAllBooks() {
         bookRepository.bookRepo();
         return bookRepository.showAll();
    }
    //@GetMapping(path = "/books/:bookid")
    
}

Я получаю следующий вывод на моем локальном хосте (почтальоне):

[
    "{\"id\":1,\"name\":\"One\",\"type\":\"fiction\",\"available\":false}",
    "{\"id\":2,\"name\":\"Two\",\"type\":\"non-fiction\",\"available\":true}",
    "{\"id\":3,\"name\":\"Three\",\"type\":\"fiction\",\"available\":true}",
    "{\"id\":4,\"name\":\"Four\",\"type\":\"fiction\",\"available\":false}",
    "{\"id\":5,\"name\":\"Five\",\"type\":\"non-fiction\",\"available\":true}",
    "null"
]

Моя цель - сделать так, чтобы это выглядело так:

 {"id":1,
  "name":"One",
  "type":"fiction",
  "available":false}",
}

То же самое для других книг. Пожалуйста, помогите мне, если знаете способ. Буду очень благодарен! ................................ .................. ............... ................................ ... .............................. .................... ............

0
Mile Stanislavov 15 Окт 2021 в 16:05

2 ответа

Лучший ответ

Удалите функцию @Override toString(). Непосредственно верните gson().toJson() в строку.

Однако это нехорошо. Вы можете определить ArrayList вместо примитивного массива. Так,

ArrayList<Book> AllBooks;
AllBooks.add(new Book(// add book 1));
AllBooks.add(new Book(// add book 2));
AllBooks.add(new Book(// add book 3));

А затем на репо вы можете просто вернуться

return new Gson.toJson(AllBooks);

< EM> ОДНАКО

Это не лучший способ, поскольку ваши книги хранятся в оперативной памяти вашего сервера. Итак, пересмотрите возможность настройки базы данных для поддержки отношений данных. Фактически, Spring предоставляет @Entity jpa, чтобы помочь вам в подобных делах. . Когда вы объявили свою книгу как объект, например

@Entity
public class Book {
    private int id;
    private String name;
    private String type;
    private boolean available;
}

Вы можете создать JpaRepository для получения всех данных, например

@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
}

А затем просто вызовите репозиторий на своем контроллере

@GetMapping(path = "/books")
public List<book> getAllBooks() {
    BookRepository bookRepo = new BookRepository();
    List<book> books = bookRepo.findAll();
    return books;
}
0
Zukaru 15 Окт 2021 в 13:48

Вам не нужно выполнять синтаксический анализ json перед возвратом в Springboot. Spring boot сделает это за вас (по умолчанию используется библиотека jackson).

Попробуй это:


  @GetMapping(path = "/books")
    public Book[] getAllBooks() { // return Book[] instead of String []
         bookRepository.bookRepo();
         return bookRepository.bookRepo(); // return all list of books
    }

0
Dilermando Lima 15 Окт 2021 в 13:22