在 Spring Boot 中返回 JSON 对象作为响应

新手上路,请多包涵

我在 Spring Boot 中有一个示例 RestController:

 @RestController
@RequestMapping("/api")
class MyRestController
{
    @GetMapping(path = "/hello")
    public JSONObject sayHello()
    {
        return new JSONObject("{'aa':'bb'}");
    }
}

我正在使用 JSON 库 org.json

当我点击 API /hello 时,我得到一个异常说:

Servlet.service() 用于路径 [] 上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败;嵌套异常是 java.lang.IllegalArgumentException: No converter found for return value of type: class org.json.JSONObject] 根本原因

java.lang.IllegalArgumentException:没有找到类型的返回值的转换器:类 org.json.JSONObject

问题是什么?有人可以解释到底发生了什么吗?

原文由 iwekesi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

当您使用 Spring Boot web 时,Jackson 依赖是隐式的,我们不必显式定义。如果使用 eclipse,您可以在依赖层次选项卡中的 pom.xml 中检查 Jackson 依赖项。

正如您使用 @RestController 注释的那样,无需进行显式 json 转换。只需返回一个 POJO,jackson 序列化程序将负责转换为 json。与@Controller一起使用时,相当于使用 @ResponseBody 。 Rather than placing @ResponseBody on every controller method we place @RestController instead of vanilla @Controller and @ResponseBody by default is applied on all resources in that控制器。

参考这个链接: 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 发布,翻译遵循 CC BY-SA 4.0 许可协议

您当前的方法不起作用的原因是默认情况下使用 Jackson 来序列化和反序列化对象。但是,它不知道如何序列化 JSONObject 。如果要创建动态 JSON 结构,可以使用 Map ,例如:

 @GetMapping
public Map<String, String> sayHello() {
    HashMap<String, String> map = new HashMap<>();
    map.put("key", "value");
    map.put("foo", "bar");
    map.put("aa", "bb");
    return map;
}

这将导致以下 JSON 响应:

 { "key": "value", "foo": "bar", "aa": "bb" }

这有点受限,因为添加子对象可能会变得有点困难。杰克逊有自己的机制,使用 ObjectNodeArrayNode 。要使用它,您必须在您的服务/控制器中自动装配 ObjectMapper 。然后你可以使用:

 @GetMapping
public ObjectNode sayHello() {
    ObjectNode objectNode = mapper.createObjectNode();
    objectNode.put("key", "value");
    objectNode.put("foo", "bar");
    objectNode.put("number", 42);
    return objectNode;
}

这种方法允许您添加子对象、数组,并使用所有不同的类型。

原文由 g00glen00b 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题