Springboot передает JSON во внешний интерфейс

Я хочу передать JSON клиенту по запросу. Мой фактический код выглядит примерно так:

...
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.Resource;
...

@RestController
public class Controller {

    @Value("classpath:file.json")
    private Resource jsonFile;

    @GetMapping(path ="json", produces = "application/json")
    public String getJSON() {
        try (InputStream in = jsonFile.getInputStream()) {
            return IOUtils.toString(in, StandardCharsets.UTF_8.name());
        }
        catch ...
    }
}

...

jsonFile — это файл .json, содержимое которого я хочу отправить обратно пользователю, аннотация @Value добавляет путь к классам.

Проблема в том, что ответ - это не только json, но и разрывы строк, закодированные как \n, и весь JSON заключен в кавычки, что делает его одной большой строкой вместо объекта. Поскольку JSON на самом деле является файлом .json, я бы не хотел сначала анализировать его в объект.

jsonFile выглядит так:

{
  "thing1": [
    {
      "list1": [
        "abc"
      ],
      "subthing1": {
        "list1": [
          "aaa",
          "bbb"
        ],
        "list2": [
          "ccc"
        ],
        "list3": [
          "zzz"
        ],

      },
      "subthing2": 
      ...

Изменить 1: возврат объекта JSON в качестве ответа в Spring Boot отвечает в последнем абзаце: «Если вы хотите вернуть сериализованную строку json, просто верните строку», что для меня красное: «если у вас есть json в строке, верните строку»


person SchreiberLex    schedule 05.06.2018    source источник
comment
что такое вар? где заявлено?   -  person pvpkiran    schedule 05.06.2018
comment
Возможно, вы захотите проверить stackoverflow.com/questions/7672858/   -  person Wim Deblauwe    schedule 05.06.2018
comment
Вы получаете строку, так как ваш код говорит об этом. то есть вернуть IOUtils.toString(in, StandardCharsets.UTF_8.name()); Пожалуйста, объясните, что такое var в вашем коде.   -  person utsav anand    schedule 05.06.2018
comment
извините, не увидел, какую информацию вы пропустили, надеюсь, это то, о чем вы просили? Также исправлено, что аннотация класса, которая ошибочно была ät.RequestController, не соответствует правильному ät.RestController.   -  person SchreiberLex    schedule 05.06.2018


Ответы (1)


Используйте средство записи для строки:

class StringRespWriper {
    private String stringResponse;
    // get/set
}

и верните его на контроллер:

@GetMapping(path ="json", produces = "application/json")
public StringRespWriper getJSON() {
    try (InputStream in = var.getInputStream()) {
    ....
}
person Eugen    schedule 05.06.2018