【问题标题】:How can I receive multiple parameter values and return data in JSON format in Spring REST?如何在 Spring REST 中接收多个参数值并以 JSON 格式返回数据?
【发布时间】:2015-08-18 23:26:28
【问题描述】:

我是 Spring 新手,我正在使用 Spring MVC4。我必须接收所有请求,读取请求中的多个参数,最后根据参数应用业务逻辑,并以 JSON 格式返回数据。

TestController.java:

@RequestMapping(value="/receiveUpdatedStressScore",params = { "value", "device_model"},method=RequestMethod.GET, produces={"application/json"})
public String receiveUpdatedStressScore(@RequestParam(value="value")  int value,@RequestParam(value="device_model") String device_model)
{
      return "Here: "+value+" device_model "+device_model;
}

网址:http://localhost:8080/appname/receiveUpdatedStressScore?value=100&device_model=nokia

但我得到的输出不在 Json 中。我在浏览器中的输出是..

这里:100 device_model nokia

如何转换成Json?

【问题讨论】:

  • 尝试使用 Jackson 解析器。它负责解析 JSON 并将 Java 转换为 JSON 。 Example
  • @Amit.rk3:嗨,我正在使用 Spring Tool Suite ->Spring Starter Project->,并且我已经选择了所有需要的 Spring 模块(Spring MVC、REST、DATA JPA 等)和 Gradle。 Spring 已经为我下载了所有必需的 jar 文件。其中 -{ jackson-coreutils, json-patch,jackson-core, jackson-databind, jackson-annotations } 都有。我还应该包括杰克逊解析器吗?谢谢。
  • 您正在返回字符串。您需要返回带有 @ResponseBody 注释的自定义 bean,如该示例中所述

标签: java json spring spring-mvc spring-restcontroller


【解决方案1】:

您的解决方案在我看来是正确的。这就是它对我的工作方式(通知@ResponseStatus:

@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/nearbyStudios", method = RequestMethod.GET, produces = { "application/json" })
public List<NearbyStudio> getNearbyStudios(Float latitude, Float longitude, Float radius) {
    return mapDao.getNearbyStudios(latitude, longitude, radius);
}

如果这不起作用,您的问题可能出在其他地方。只要您返回的内容实现Serializable,Spring 就会为您将结果转换为 JSON。

【讨论】:

    【解决方案2】:

    您需要在方法返回之前放置注解@ResponseBody,如:

    @RequestMapping(value="/receiveUpdatedStressScore",params = { "value", "device_model"},method=RequestMethod.GET, produces={"application/json"})
    
    public @ResponseBody String receiveUpdatedStressScore(@RequestParam(value="value") int  value,@RequestParam(value="device_model") String device_model){ 
    return "Here: "+value+" device_model "+device_model; 
    

    }

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

    还要确保在你的类路径中你有 Jackson 库:你的类路径中有 jackson-core 和 jackson-databind

    【讨论】:

    • 返回语句不是json格式。他的问题是如何将其转换为 json。要么将其形成为 json 字符串,要么直接返回对象,produces 将在这两种情况下将其转换为 json 对象。
    • 非常感谢@gerardribas。当我阅读一些网站时,Spring MVC 4 不需要@ResponseBody。因为@RestController 有它inbult。
    【解决方案3】:

    Json 是 JavaScript Object Notation。它应该是特定的格式。您将在下面的链接中找到更多关于 json 的信息。

    http://www.w3schools.com/json/

    在您的情况下,返回的字符串应采用以下格式。

    {
        "value": "100",
        "device_model": "nokia"
    }
    

    您可以在下面的链接中验证您的 json。

    http://jsonlint.com/

    如果 Stefan Falk 回答,这个produces = { "application/json" } 代码将返回特定模型对象的 json。在你的情况下,我没有看到任何模型对象。

    【讨论】:

      【解决方案4】:

      您返回的字符串不会自动转换为 JSON。 做这样的事情(注意@ResponseBody 并确保你有杰克逊作为依赖):

       @RequestMapping(value="/receiveUpdatedStressScore")
      public @ResponseBody Device receiveUpdatedStressScore(@RequestParam(value="value") int value,@RequestParam(value="device_model") String deviceModel)
      
      { 
          Device device = new Device();
          device.setDeviceModel(deviceModel);
          device.setValue(value);
          return device; 
      }
      
      public class Device {
          int value;
          String deviceModel;
          public int getValue() {
              return value;
          }
          public void setValue(int value) {
              this.value = value;
          }
          public String getDeviceModel() {
              return deviceModel;
          }
          public void setDeviceModel(String deviceModel) {
              this.deviceModel = deviceModel;
          }
      
      }
      

      【讨论】:

        【解决方案5】:

        只要我应用业务逻辑并返回模型而不仅仅是参数值本身,我的问题就解决了。当我返回模型时,Jackson 将模型对象转换为 json 进行了所有必要的处理。

        这是我更新的代码:

        @RequestMapping(value="/receiveUpdatedStressScore",params = { "value", "device_model" },method=RequestMethod.GET,produces={"application/json"})
        
        public StressScore receiveUpdatedStressScore(@RequestParam(value="value")  Short value,@RequestParam(value="device_model") String device_model)
        {
        
            StressScore s=new StressScore();
            s.setScore(value);
            s.setDevice_model(device_model);
        
        
            return s;
        
        }
        

        网址: http://localhost:8080/appname/receiveUpdatedStressScore?value=100&device_model=nokia

        在浏览器中输出:

        {"device_model":"nokia","api_key":null,"time":0,"score":100}

        非常感谢。

        【讨论】:

          【解决方案6】:

          最好返回一个带有@ResponseBody 注释的模型bean,而不是返回一个字符串。这将确保响应是格式正确的 JSON

          类似下面的东西

          @RequestMapping(value="/receiveUpdatedStressScore",params = { "value", "device_model"},method=RequestMethod.GET, produces={"application/json"})
          public @ResponseBody MyBean receiveUpdatedStressScore(@RequestParam(value="value")  int value,@RequestParam(value="device_model") String device_model)
          {
                MyBean mb= new MyBean();
                 mb.setValue(value);
                 mb.setDevice_model(device_model);
                return mb;
          }
          

          【讨论】:

            【解决方案7】:

            你可以这样做:

            在控制器上:

            @RequestMapping(value="/receiveUpdatedStressScore",params = { "value",
            "device_model"},method=RequestMethod.GET, produces={"application/json"})
            public String receiveUpdatedStressScore(@RequestParam(value="value")  
             int     value,@RequestParam(value="device_model") String device_model)
            {
              return "{Here: "+value+", device_model: "+device_model + "}";
            }
            

            在客户端:

            function receiveUploadedStressScore(){
               $http.get("/receiveUpdatedStressScore?value=100&device_model=nokia")
                .success(function(data){
               var jsonObj = $.parseJSON(data.content);
              });
            }
            

            【讨论】:

              猜你喜欢
              • 2019-04-24
              • 1970-01-01
              • 2011-04-21
              • 1970-01-01
              • 2015-07-04
              • 2015-04-12
              • 2011-06-11
              • 2021-05-16
              • 1970-01-01
              相关资源
              最近更新 更多