Как вернуть правильный JSON в JAVA

 private List<String> itemsInCart = new ArrayList<>();
 private List<String> itemObjectsInCart = new ArrayList<>();

@CrossOrigin
@GetMapping(value = "/cartitems")
public List<String> getItemsInCart(@RequestParam("buyerId") Integer buyerId) {
    if (cartRepository.findByBuyerIdAndIsCompleted(buyerId, false) != null){
        return getItemObjects(cartRepository.findByBuyerIdAndIsCompleted(buyerId, false).getItemsInCart());
    } else {
        return itemsInCart;
    }
}

public List<String> getItemObjects(List<String> itemsInCart){
    for (String item: itemsInCart) {
        String uri = "http://192.168.160.182:8762/item-service/items/" + item;
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(uri, String.class);
        JSONObject jsonObject = new JSONObject(result);
        System.out.println(jsonObject);
        if (itemObjectsInCart.contains(result)){
            return itemObjectsInCart;
        } else {
            itemObjectsInCart.add(result);
        }
    }
return itemObjectsInCart;
}

Привет, ребята! Мой код выше возвращает JSON в этом формате:

["{\"id\":1,\"name\":\"Stick\",\"description\":\"A stick\",\"price\":100,\"available\":true,\"img\":\"https://vignette.wikia.nocookie.net/tokipona/images/a/aa/Stick.png/revision/latest?cb=20171120043817\",\"uploadDate\":\"2019-01-16\",\"sellerId\":1}"]

Но хотелось бы без обратных косых черт. Вы знаете, как я могу преобразовать его в правильный массив JSON?

Заранее спасибо!

Вы можете использовать аннотацию @RestController, и ответ будет возвращен как json.

ygbgames 16.01.2019 15:57

Вы возвращаете список строк json. Вам нужно будет либо вернуть строку один, содержащую json, либо позволить контроллеру сделать это за вас, но в последнем случае вы не должны конвертировать свои данные в json самостоятельно.

Thomas 16.01.2019 16:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
806
2

Ответы 2

Добавьте @ResponseBody в свой метод обработчика запросов или аннотируйте свой контроллер как @RestController.

Убедитесь, что у вас есть конвертер jackson в пути к классам. Вы можете следовать этому руководству - https://www.journaldev.com/2552/spring-rest-example-tutorial-spring-restful-web-services

Не используйте JSONObject для сопоставления с JSON и не читайте String напрямую. Создайте новый класс POJO для ответа и позвольте RestTemplate сделать всю работу. Внутри Spring будет использовать подходящий конвертер для сопоставления объектов:

public class Item {
  int id;
  String name;
  String description;
  // other fields
  // getters and setters
}

Item result = restTemplate.getForObject(uri, Item.class);

Ваш метод контроллера также должен возвращать Item, а не String:

@GetMapping"/cartitems")
public List<Item> getItemsInCart(@RequestParam("buyerId") Integer buyerId) { 
   // ...
}

Другие вопросы по теме