Вернуть JSON для ResponseEntity <String>

В моем контроллере есть метод, который должен 9X_spring-web возвращать строку в формате JSON. Он возвращает 9X_spring-mvc-initbinders JSON для непримитивных типов:

@RequestMapping(value = "so", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity so() { return new ResponseEntity("This is a String", HttpStatus.OK); } 

Ответ curl:

This is a String 

46
0
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Вернуть JSON для ResponseEntity <String>

Корень проблемы в том, что Spring (через 9X_spring-mvc ResponseEntity, RestController и / или ResponseBody) будет использовать содержимое строки 9X_spring-mvc-initbinders в качестве необработанного значения ответа, а 9X_spring-web не обработка строки как значения JSON для 9X_spring-mvc-initbinders кодирования. Это верно даже тогда, когда 9X_spring-mvc-initbinders метод контроллера использует produces = MediaType.APPLICATION_JSON_VALUE, как в вопросе 9X_spring-web здесь.

По сути, это похоже на разницу между 9X_spring-web следующим:

// yields: This is a String System.out.println("This is a String"); // yields: "This is a String" System.out.println("\"This is a String\""); 

Первый вывод нельзя анализировать 9X_spring-mvc-initbinders как JSON, но второй вывод можно.

Что-то вроде 9X_spring-mvc '"'+myString+'"', вероятно, не является хорошей идеей, так 9X_spring-web как это не обработает правильное экранирование 9X_spring-mvc двойных кавычек внутри строки и не создаст 9X_spring-mvc допустимый JSON для любой такой строки.

Один 9X_spring-mvc-initbinders из способов справиться с этим - встроить 9X_spring-web вашу строку в объект или список, чтобы вы 9X_spring-mvc не передавали необработанную строку в Spring. Однако 9X_spring-mvc-initbinders это изменяет формат вашего вывода, и на 9X_spring-mvc самом деле нет веской причины не иметь возможности 9X_spring-mvc-initbinders не возвращать правильно закодированную строку 9X_spring-mvc-initbinders JSON, если это то, что вы хотите сделать. Если 9X_spring-mvc это то, что вы хотите, лучший способ справиться 9X_spring-mvc с этим - использовать средство форматирования 9X_spring-web JSON, такое как Json или Google Gson. Вот как это может 9X_spring-mvc-initbinders выглядеть с Gson:

import com.google.gson.Gson; @RestController public class MyController private static final Gson gson = new Gson(); @RequestMapping(value = "so", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity so() { return ResponseEntity.ok(gson.toJson("This is a String")); } } 

70
2

  • Это правильный ответ. Вероятно, вы должны спросить себя, действительно ли вам нужно поддерживать JSON для этой конечной точки, которая будет возвращать только строку. Если не просто изменить произ ...

Ответ #2

Ответ на вопрос: Вернуть JSON для ResponseEntity <String>

@RequestMapping(value = "so", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody String so() { return "This is a String"; } 
9X_spring-mvc
21
0

Ответ #3

Ответ на вопрос: Вернуть JSON для ResponseEntity <String>

import org.springframework.boot.configurationprocessor.json.JSONException; import org.springframework.boot.configurationprocessor.json.JSONObject; public ResponseEntity
 ApiCall(@PathVariable(name = "id") long id) throws JSONException { JSONObject resp = new JSONObject(); resp.put("status", 0); resp.put("id", id); return new ResponseEntity(resp.toString(), HttpStatus.CREATED); } 
9X_spring-mvc
3
0

Ответ #4

Ответ на вопрос: Вернуть JSON для ResponseEntity <String>

Альтернативным решением является использование 9X_spring-mvc-initbinders оболочки для String, например:

public class StringResponse { private String response; public StringResponse(String response) { this.response = response; } public String getResponse() { return response; } } 

Затем верните это 9X_spring-web в методах вашего контроллера:

ResponseEntity 

1
0