java-在Spring B中返回JSON对象作为响应
我在Spring Boot中有一个示例RestController:
@RestController
@RequestMapping("/api")
class MyRestController
{
@GetMapping(path = "/hello")
public JSONObject sayHello()
{
return new JSONObject("{'aa':'bb'}");
}
}
我正在使用JSON库/hello
当我点击API /hello时,出现异常提示:
Servlet [dispatcherServlet]在带有路径的上下文中的Servlet.service() []引发异常[请求处理失败; 嵌套异常为 java.lang.IllegalArgumentException:找不到返回的转换器 类型值:类org.json.JSONObject],根本原因
java.lang.IllegalArgumentException:找不到返回的转换器 类型的值:类org.json.JSONObject
有什么问题 有人可以解释到底发生了什么吗?
5个解决方案
62 votes
当您使用Spring Boot Web时,Jackson依赖关系是隐式的,我们不必显式定义。 如果使用eclipse,则可以在依赖项层次结构选项卡中的@RestController中检查Jackson依赖项。
并且正如您使用@RestController进行注释一样,无需进行显式的json转换。 只需返回一个POJO,杰克逊序列化器将负责转换为json。 与@Controller一起使用时,等效于使用@ResponseBody。 我们没有将2721665459534955555523放置在每个控制器方法上,而是默认将2721665459534955555524和@ResponseBody放置在该控制器中的所有资源上,而不是在每个控制器方法上放置2721665459534955555523。
请参阅以下链接:[https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody]
您面临的问题是因为返回的对象(JSONObject)没有某些属性的吸气剂。 您的意图不是序列化此JSONObject而是序列化POJO。 因此,只需返回POJO。
请参阅此链接:[https://stackoverflow.com/a/35822500/5039001]
如果要返回json序列化的字符串,则只需返回该字符串。 在这种情况下,Spring将使用StringHttpMessageConverter而不是JSON转换器。
prem kumar answered 2020-01-27T21:47:11Z
34 votes
您当前的方法不起作用的原因是,默认情况下使用Jackson来序列化和反序列化对象。 但是,它不知道如何序列化JSONObject。如果要创建动态JSON结构,则可以使用ObjectNode,例如:
@GetMapping
public Map sayHello() {
HashMap map = new HashMap<>();
map.put("key", "value");
map.put("foo", "bar");
map.put("aa", "bb");
return map;
}
这将导致以下JSON响应:
{ "key": "value", "foo": "bar", "aa": "bb" }
这有点受限制,因为添加子对象可能会变得更加困难。 杰克逊有自己的机制,使用ObjectNode和ArrayNode。要使用它,必须在服务/控制器中自动连线ObjectMapper。 然后,您可以使用:
@GetMapping
public ObjectNode sayHello() {
ObjectNode objectNode = mapper.createObjectNode();
objectNode.put("key", "value");
objectNode.put("foo", "bar");
objectNode.put("number", 42);
return objectNode;
}
这种方法使您可以添加子对象,数组并使用所有各种类型。
g00glen00b answered 2020-01-27T21:47:45Z
31 votes
您可以按照@vagaasen的建议将响应返回为String,也可以使用Spring提供的ResponseEntity,如下所示。 通过这种方式,您还可以返回Http status code,这在Web服务调用中更为有用。
@RestController
@RequestMapping("/api")
public class MyRestController
{
@GetMapping(path = "/hello", produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity sayHello()
{
//Get data from service layer into entityList.
List entities = new ArrayList();
for (Entity n : entityList) {
JSONObject entity = new JSONObject();
entity.put("aa", "bb");
entities.add(entity);
}
return new ResponseEntity(entities, HttpStatus.OK);
}
}
Sangam Belose answered 2020-01-27T21:48:06Z
8 votes
您也可以为此使用哈希表
@GetMapping
public HashMap get() {
HashMap map = new HashMap<>();
map.put("key1", "value1");
map.put("results", somePOJO);
return map;
}
maximus answered 2020-01-27T21:48:26Z
4 votes
@RequestMapping("/api/status")
public Map doSomething()
{
return Collections.singletonMap("status", myService.doSomething());
}
PS。 仅适用于1个值
Dmitry answered 2020-01-27T21:48:46Z