首页 文章

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

提问于
浏览
37

我在Spring启动时有一个示例Rest Controller:

@RestController
@RequestMapping("/api")
class MyRestController
{

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


}

我正在使用json库:org.json

当我点击api /你好时,我得到一个异常说:

servlet [dispatcherServlet]的Servlet.service()在上下文中与path []引发了异常[请求处理失败;嵌套异常是java.lang.IllegalArgumentException:找不到类型为:class org.json.JSONObject的返回值的转换器,其根本原因为java.lang.IllegalArgumentException:找不到类型为:class org.json.JSONObject的返回值的转换器

问题是什么有人可以解释究竟发生了什么 . 我是SpringBoot的新手 .

提前致谢 :)

5 回答

  • 7

    当您使用spring boot web时,jackson依赖是隐式的,我们不必明确定义 . 如果使用eclipse,您可以在依赖关系层次结构选项卡中检查pom.xml中的jackson依赖项 .

    由于您使用_2532332注释,因此无需进行显式json转换 . 只需返回一个POJO和jackson序列化器将负责转换为json . 它等同于在与@Controller一起使用时使用 @ResponseBody . 我们不会在每个控制器方法上放置 @ResponseBody ,而是将 @RestController 而不是vanilla @Controller@ResponseBody 默认应用于该控制器中的所有资源 .
    Refer this link: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

    您遇到的问题是因为返回的对象(JSONObject)没有某些属性的getter . 并且您的目的不是序列化此JSONObject,而是序列化POJO . 所以只需返回POJO .
    Refer this link: https://stackoverflow.com/a/35822500/5039001

    如果要返回json序列化字符串,则只返回字符串 . 在这种情况下,Spring将使用StringHttpMessageConverter而不是JSON转换器 .

  • 28

    您当前的方法不知道如何序列化 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" }
    

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

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

    此方法允许您添加子对象,数组和使用所有各种类型 .

  • 23

    您可以按照@vagaasen的建议将响应返回为 String ,也可以使用Spring提供的 ResponseEntity Object,如下所示 . 通过这种方式,您还可以返回 Http status code ,这在webservice调用中更有帮助 .

    @RestController
    @RequestMapping("/api")
    public class MyRestController
    {
    
        @GetMapping(path = "/hello", produces=MediaType.APPLICATION_JSON_VALUE)
        public ResponseEntity<Object> sayHello()
        {
             //Get data from service layer into entityList.
    
            List<JSONObject> entities = new ArrayList<JSONObject>();
            for (Entity n : entityList) {
                JSONObject entity = new JSONObject();
                entity.put("aa", "bb");
                entities.add(entity);
            }
            return new ResponseEntity<Object>(entities, HttpStatus.OK);
        }
    }
    
  • 2

    你也可以使用hashmap

    @GetMapping
    public HashMap<String, Object> get() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("results", somePOJO);
        return map;
    }
    
  • 47
    @RequestMapping("/api/status")
    public Map doSomething()
    {
        return Collections.singletonMap("status", myService.doSomething());
    }
    

    PS . 仅适用于1个值

相关问题