Json 如何在响应主体上添加额外的标题

Json 如何在响应主体上添加额外的标题,json,spring,spring-mvc,Json,Spring,Spring Mvc,只需查看SpringMVC-3.2.xcontrolleraction方法的代码片段。生成JSON非常容易,但无法仅为特定控制器的此操作/特定操作方法添加附加自定义头。并非所有的JSON@ResponseBody操作方法都通用 @RequestMapping(value="ajaxDenied", method = RequestMethod.GET) public @ResponseBody Map<String, Object> ajaxDenied(ModelMap model

只需查看
SpringMVC-3.2.x
controlleraction方法的代码片段。生成
JSON
非常容易,但无法仅为特定控制器的此操作/特定操作方法添加附加自定义头。并非所有的
JSON
@ResponseBody
操作方法都通用

@RequestMapping(value="ajaxDenied", method = RequestMethod.GET)
public @ResponseBody Map<String, Object> ajaxDenied(ModelMap model) {

    Map<String, Object> message = new HashMap<String, Object>();
    message.put("severity", "error");
    message.put("summary", "Restricted access only");
    message.put("code", 200);

    Map<String, Object> json = new HashMap<String, Object>();
    json.put("success", false);
    json.put("message", message);

    return json;
}
此操作方法可以生成带有转义字符的
JSON
字符串,而不是纯的
JSON
,因此取决于浏览器如何解析它,这会导致chrome失败。输出就像

"{\"message\":{\"summary\":\"Authenticated successfully.\",\"location\":\"/\",\"severity\":\"info\",\"code\":\"200\"},\"success\":true}"
但是我们期望的产出

{
  "message":{
    "summary": "Authenticated successfully.",
    "location":"/",
    "severity":"info",
    "code":"200"
  },
  "success":true
}

我想根据特定控制器的特定操作条件,生成带有附加标题的纯
JSON

以下是根据M.Deinum

@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
public ResponseEntity<Map<String, Object>> ajaxSuccess(){
    Map<String, Object> message = new HashMap<String, Object>();

    message.put("severity", "info");
    message.put("location", "/");
    message.put("summary", "Authenticated successfully.");
    message.put("code", 200);

    Map<String, Object> json = new HashMap<String, Object>();
    json.put("success", true);
    json.put("message", message);

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=UTF-8");
    headers.add("X-Fsl-Location", "/");
    headers.add("X-Fsl-Response-Code", "302");
    return (new ResponseEntity<Map<String, Object>>(json, headers, HttpStatus.OK));
}
@RequestMapping(value=“ajaxSuccess”,method=RequestMethod.GET)
公共响应ajaxSuccess(){
Map message=newhashmap();
message.put(“严重性”、“信息”);
message.put(“位置”、“/”);
message.put(“摘要”,“已成功验证”);
电文("电码",200),;
Map json=newhashmap();
json.put(“success”,true);
put(“message”,message);

HttpHeaders=新的HttpHeaders(); 添加(“内容类型”、“应用程序/json;字符集=UTF-8”); 标题。添加(“X-Fsl-Location”、“/”; 标题。添加(“X-Fsl-Response-Code”、“302”); 返回(新的ResponseEntity(json,headers,HttpStatus.OK)); }
您还可以使用
HttpServletResponse
以更简单的方式添加状态和标题:

@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
@ResponseBody
public String ajaxSuccess(HttpServletResponse response) {
  response.addHeader("header-name", "value");
  response.setStatus(200);
  return "Body";
}
因此,您需要按照提供的添加以下maven依赖项

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>7.0.53</version>
    <scope>provided</scope>
</dependency>

org.apache.tomcat
TomcatServletAPI
7.0.53
假如

您可以向ResponseEntity builder添加标题。我认为这样比较干净

import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;

// ...

@GetMapping("/my/endpoint")
public ResponseEntity myEndpointMethod() {

    HttpHeaders headers = new HttpHeaders();
    headers.add(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");

    return ResponseEntity.ok()
            .headers(headers)
            .body(data);
}

你为什么要改变自己?让Spring为您处理这个问题。。。只需返回一个
ResponseEntity
而不是
ResponseEntity
,取下映射器,让spring来完成繁重的工作。是的,你是对的。我太笨了,无法建立这样的逻辑。非常感谢你的建议。你找到解决办法了吗?在依赖项升级之后,我也有同样的问题。我的响应主体和引用将以\进行转义。只需按照答案进行操作,我希望您将获得类似的解决方案HttpHeaders=new HttpHeaders();添加(“授权令牌”,令牌);返回新的响应属性(“身份验证成功”,标题,HttpStatus.OK);较新版本的Spring返回只读HttpHeader,使用此示例将抛出UnsupportedOperationException。
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;

// ...

@GetMapping("/my/endpoint")
public ResponseEntity myEndpointMethod() {

    HttpHeaders headers = new HttpHeaders();
    headers.add(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");

    return ResponseEntity.ok()
            .headers(headers)
            .body(data);
}