我的控制器中有一个方法应该在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
答案 0 :(得分:34)
问题的根源是Spring(通过ResponseEntity,RestController和/或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格式化程序,例如Json或Google 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);
}