【发布时间】:2018-07-23 16:32:41
【问题描述】:
当我通常使用返回 JSON 数据的 Java Spring 制作控制器端点时,我的返回类型通常是 String;我将 toString() 我的 JSON 对象并在我的 Javascript 中解析它们。最近,我在某处读到这不是“正确”的做法(试图遵循最佳实践和指导方针)。我正在开始一个新项目,其中我的返回类型是 JSON 对象(依赖项是 org.json)。
当我尝试在浏览器中访问端点时,我收到一个 406 错误,描述为“此请求标识的资源只能生成具有根据请求“接受”标头不可接受的特征的响应。”。
这是我的端点现在的样子:
@RequestMapping(value = "/api/get-items", method = {RequestMethod.GET, RequestMethod.POST}, headers = "Accept=application/json")
@ResponseBody
public JSONObject doGetItems(HttpServletRequest request, HttpServletResponse response) {
JSONObject data = new JSONObject();
JSONArray items = new JSONArray();
JSONObject item1 = new JSONObject().put("id", 123);
JSONObject item2 = new JSONObject().put("id", 456);
JSONObject item3 = new JSONObject().put("id", 789);
items.put(item1).put(item2).put(item3);
data.put("data", items);
return data;
}
我怎样才能让它工作并返回 JSON?还是我应该返回我的 JSON 对象的字符串化版本并且我一直都在正确地执行此操作?
更新
首先,我尝试去掉@RequestMapping注解中的headers参数。我仍然收到 406 错误。
然后我尝试更改/添加 @RequestMapping 注释中的参数,但也没有运气。这是我尝试将其更改为:
@RequestMapping(value = "/api/get-items",
method = {RequestMethod.GET, RequestMethod.POST},
headers = "Accept=*/*",
produces = MediaType.APPLICATION_JSON_VALUE)
我仍然收到 406 错误。
【问题讨论】:
-
Un 没有正确理解。 Spring 不处理 org.json.JSONObject 的实例。它使用 Jackson(或 GSON,取决于您在类路径中的内容)自动解析/编组从/到实际 Java 类。因此,例如,如果您想返回一个项目数组,其中每个项目都有一个 ID、一个名称和一个 startInstant,例如,那么只需返回一个 List
。官方示例见spring.io/guides/gs/rest-service。 -
@JBNizet 我尝试使用 gson 将我的一个端点中的所有
JSONObjects 和JSONArrays 更改为JsonObject和JsonArray,但随后出现 500 错误说“无法写入 JSON:这不是 JSON Primitive。” -
再次阅读我的评论。您不应该返回 JsonArrays 或 JsonObjects。您应该返回 POJO,它将映射到 JSON。如我喜欢的示例所示。
-
简单。我确实读过你的评论。其中一部分说“或 GSON”,所以我尝试了
JsonObject和JsonArray。无论如何,我现在了解使用 Java 对象。如果我toString()使用org.JSON构建的 JSON 对象,Spring 实际上会处理其余部分并将它们作为实际 JSON 返回。我对此很好;只是我的一个误解。如果您将回复作为答案提交,我会将其标记为正确。
标签: java json spring controller response