返回ResponseEntity <string> </string>的JSON

时间:2013-08-22 15:53:53

标签: spring-mvc

我的控制器中有一个方法应该在JSON中返回一个String。它返回非基本类型的JSON:

@RequestMapping(value = "so", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
ResponseEntity<String> so() {
    return new ResponseEntity<String>("This is a String", HttpStatus.OK);
}

卷曲响应是:

This is a String

5 个答案:

答案 0 :(得分:34)

问题的根源是Spring(通过ResponseEntityRestController和/或ResponseBody)将使用字符串的内容作为原始响应值,而不是将字符串视为要编码的JSON值。即使控制器方法使用produces = MediaType.APPLICATION_JSON_VALUE也是如此,如此处的问题所示。

它基本上类似于以下内容之间的区别:

// yields: This is a String
System.out.println("This is a String");

// yields: "This is a String"
System.out.println("\"This is a String\"");

第一个输出无法解析为JSON,但第二个输出可以。

'"'+myString+'"'之类的东西可能不是一个好主意,因为它不会处理字符串中双引号的正确转义,也不会为任何此类字符串生成有效的JSON。

处理此问题的一种方法是将字符串嵌入到对象或列表中,这样您就不会将原始字符串传递给Spring。但是,这会改变输出的格式,实际上没有理由不能返回正确编码的JSON字符串,如果这是你想要做的。如果这是您想要的,处理它的最佳方式是通过JSON格式化程序,例如JsonGoogle Gson。以下是Gson的看法:

import com.google.gson.Gson;

@RestController
public class MyController

    private static final Gson gson = new Gson();

    @RequestMapping(value = "so", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    ResponseEntity<String> so() {
        return ResponseEntity.ok(gson.toJson("This is a String"));
    }
}

答案 1 :(得分:13)

@RequestMapping(value = "so", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String so() {
    return "This is a String";
}

答案 2 :(得分:0)

另一种解决方案是为String使用包装器,例如:

public class StringResponse {
    private String response;
    public StringResponse(String response) {
        this.response = response;
    }
    public String getResponse() {
        return response;
    }
}

然后在控制器的方法中返回它:

ResponseEntity<StringResponse>

答案 3 :(得分:0)

这是一个字符串,而不是json结构(键,值),请尝试:

返回新的ResponseEntity(“ {” vale“:”这是一个字符串“}”,HttpStatus.OK);

答案 4 :(得分:0)

public ResponseEntity<?> ApiCall(@PathVariable(name = "id") long id) {
    JSONObject resp = new JSONObject();
    resp.put("status", 0);
    resp.put("id", id);

    return new ResponseEntity<String>(resp.toString(), HttpStatus.CREATED);
}