【问题标题】:Spring RESTful Webservice - Returning JSON without model objectSpring RESTful Webservice - 返回没有模型对象的 JSON
【发布时间】:2016-05-23 00:07:38
【问题描述】:

那里。
我对在 Spring RESTful WebService 上返回 JSONObjects 有疑问。

这里是:
我的控制器中有一个方法,我想让它返回一个 JSONObject。但是,当我将它的返回类型设置为 JSONObject 并有效地返回 JSONObject 时,我收到以下错误:

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type: class org.json.JSONObject

所以,我实际上明白这意味着什么,并且我已经为这个问题寻找答案至少 3 天了。

这是我的代码:

@RequestMapping(value = "/value", method = RequestMethod.POST)
public String method(HttpServletRequest request) {
    JSONObject json = new JSONObject();
    json.put("example", "example message");

    return json.toString();
}

我真的不知道当我必须在前端使用它时这是否会起作用(这将是一个外部应用程序)。我必须返回一个 true JSONObject 吗?还是返回 JSONObject.toString() 应该可以正常工作?

最后一件事:
大多数关于返回 JSONObject 的教程都使用我不想使用的模型对象来教授该过程。有没有办法在不使用模型对象的情况下做到这一点?

提前谢谢,偷看!

【问题讨论】:

  • 显示失败的代码。你有没有用@ResponseBody注释JSONObject有问题的方法?
  • 我还要注意你会带来不必要的麻烦;在这种情况下,您可以简单地返回一个Map<String,String>,这样可以正常工作并且不会那么复杂。
  • @chrylis 不,实际上我的控制器是@RestController,所以不需要用@ResponseBody(对吗?)注释方法。因此,我希望它返回一个 JSON,因为我计划在使用 JQuery(可能是 AJAX)发布到我的操作后使用该响应。
  • 没错,但你没有发布。那么为什么你不只是返回地图呢?假设您的应用程序中包含 JSON 支持,Spring 将为您转换它(并且您应该使用 Spring Boot,这将)。

标签: java json spring web-services rest


【解决方案1】:

我遇到了同样的问题,解决方案非常简单。我假设您的依赖项中有 Jackson,然后您可以执行以下操作:

在你创建了一个JSONObject 之后你想返回,只需写:return jsonObject.toMap(),剩下的工作就交给Jackson。不要忘记将方法的返回类型更改为Map<String, Object>,并应用适当的注释:在方法上使用@ResponseBody,或者在整个类上使用@RestController。这取决于您的需求。

你的情况是:

@RequestMapping(value = "/value", method = RequestMethod.POST)
public @ResponseBody Map<String, Object> method(HttpServletRequest request) {
    JSONObject json = new JSONObject();
    json.put("example", "example message");

    return json.toMap();
}

【讨论】:

    【解决方案2】:

    只需使用 @ResponseBody 注释您的方法。

    【讨论】:

      【解决方案3】:

      将类注解改为@RestController,然后返回模型对象或Map&lt;String, Object&gt;。您无需为该任务与JSONObject 混淆。

      @ResponseBody 的方法,如 akhill 回答,也可以,但如果所有控制器都是 REST,则过于冗长。

      【讨论】:

      • 返回 Map 的最大问题是我将整个逻辑实现为 JSONObjects,并且我也使用了几个 JSONArrays。我将控制器注释为@RestController。你会知道如果我返回一个 json.toString(),我能在前端将它作为 JSON 使用吗?
      • 为什么前端应该关心 JSON 是如何构造的?无论如何,它最终都会成为文本!这里唯一可能的问题是 mime 类型。看起来这篇文章可能会有所帮助:stackoverflow.com/questions/3616359/…
      • 在此之前感谢您的帮助。所以,根据你刚才说的,如果我返回一个纯文本,一个类似这样的字符串:{"name":"Your name"},它表示后端生成的 JSON,我仍然可以在前端将它作为 JSON 使用-结尾?我已经可以将字符串响应呈现给浏览器了,问题是:我找不到消费它的方法。
      • 我不明白这个问题。您只需执行 $http.post("/your/url") 并接收一个 JS 对象,无论服务器端发生什么,只要它不给您 500 个代码。
      【解决方案4】:

      如果您使用 Jackson 进行映射,则可以返回一个 ObjectNode。它是杰克逊对 json 对象的表示。还有一个 ArrayNode 类。如果你想使用自己的实现,那么要么写一个HttpMessageConverter,允许读写json,要么使用toString方法,如果这实际上返回一个json字符串。

      【讨论】:

      • 通过返回一个JSON字符串,我能在前端正常消费吗?
      【解决方案5】:

      你也可以使用匿名对象:

      new Object() {
          public final int code = 0;
      
          public final List<T> data = ...;
      }
      

      【讨论】:

        【解决方案6】:

        我用这种方法很容易解决:

        @RequestMapping({"/jsontest"})
            public @ResponseBody
            Map<String, Object> jsonTest() {
                String json = "{\"name\":\"farshad\", \"age\":34 , \"list\": [ 1 , 2 , 3 ] , \"objects\": [ {\"name\":\"a\", \"age\":\"10\"} , {\"name\":\"b\", \"age\":\"20\"} , {\"name\":\"c\", \"age\":\"30\"} ] }"; 
                ObjectMapper mapper = new ObjectMapper();
        
                // convert JSON string to Map
                Map<String, Object> map = mapper.readValue(json, Map.class);
                return map;
            }
        

        依赖:

        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.9.8</version>
        </dependency>
        

        进口:

        /* Json Imports */
        import com.fasterxml.jackson.databind.ObjectMapper;    
        import java.util.Map;
        

        结果:

        【讨论】:

          猜你喜欢
          • 2015-06-24
          • 2018-02-25
          • 2017-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多