【问题标题】:spring mvc output in json formatjson格式的spring mvc输出
【发布时间】:2015-11-27 06:31:30
【问题描述】:

我对 spring mvc 和 java 非常陌生。我想返回一个 json 数据而不是字符串

@RequestMapping(value = "/ex/foos", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public String getFoosAsJsonFromREST() {
    return "{\"name\":\"MyNode\", \"width\":200, \"height\":100}";
}

实际输出:
"{\"name\":\"MyNode\", \"width\":200, \"height\":100}"

我想要的输出:
{"name":"MyNode", "width":200, "height":100}

我点击了链接,但我仍然无法获得文字 json 输出

@RequestMapping(value = "/ex/foos", method = RequestMethod.GET,produces = "application/json") @ResponseBody 公共 JsonNode getFoosAsJsonFromREST() {

  String everything = "{\"a\":2,\"b\":\"astring\",\"c\":6}";
  ObjectMapper mapper = new ObjectMapper();
  JsonNode node = mapper.readTree(everything);
  return node;
}

输出 { “结果”:错误, "message": "当 base64 内容在 [Source: N/A; line: -1, column: -1] 时出现意外的字符串结尾\n" }

【问题讨论】:

标签: json spring spring-mvc


【解决方案1】:

你快到了:)

JSON 只是一种对象格式,因此您必须返回一个带有键值对的对象。

@RequestMapping(value = "/ex/foos", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public MyJSONRespone getFoosAsJsonFromREST() {
  MyJSONRespone myResponse = new MyJSONRespone();
  myResponse.setName("MyNode");
  myResponse.setWidth(200);
  myResponse.setHeight(100);        
  return myResponse;
}

class MyJSONRespone{

  private String name;

  private Integer width;

  private Integer Height;

  //setters and getters

}

如果你使用 Maven,还要确保你的 POM 中有正确的依赖:

    <!-- Jackson/JSON START -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.4.2</version>
    </dependency>

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

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.4.2</version>
    </dependency>
    <!-- Jackson/JSON END -->

【讨论】:

  • 有没有办法在不创建 MyJSONRespone 类的情况下输出 json 对象格式?
  • 对不起 - 刚刚看到这个。你还需要帮助吗?
【解决方案2】:

当然,您可以在没有自己的类的情况下返回 json 输出。第一种方法和你的一样试试这个https://stackoverflow.com/a/64482663/10353679

@RequestMapping(value = "/ex/fooss", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public ResponseEntity<JsonNode> getDeneme() {
    String everything = "{\"name\":\"MyNode\", \"width\":200, \"height\":100}";
    ObjectMapper mapper = new ObjectMapper();
    JsonNode node = null;
    try {
        node = mapper.readTree(everything);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return ResponseEntity.ok(node);
}

上面的例子应该可以工作

您的代码中的第二种方法只是返回 node.toString() 并带有produce =“application/json”。 json 只是格式。客户端可能只会检查 Content-Type 是 application/json,如果 json 的格式正确,客户端的解析器就会解析它。

@RequestMapping(value = "/ex/foos", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public String getDeneme() {
    String everything = "{\"a\":2,\"b\":\"astring\",\"c\":6}";
    ObjectMapper mapper = new ObjectMapper();
    JsonNode node = null;
    try {
        node = mapper.readTree(everything);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return node.toString();
}

重要提示:node.toString();可能会返回 NullPointerException 因为 node 可以为 null 你应该正确处理它。

另外一点是你不应该每次都创建新的 ObjectMapper。您应该将 ObjectMapper 作为一个字段注入到这个 Controller 类中,然后只使用注入的 objectMapper

【讨论】:

  • 嘿@argmnt 你能添加一个sn-p代码来支持你的答案吗?这将大大改善您的回答。
猜你喜欢
  • 2016-09-06
  • 2018-02-10
  • 2017-07-29
  • 2017-10-03
  • 2015-05-15
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多