首页 > 解决方案 > 为什么我的两个简单的 Spring REST 服务返回两种不同的 JSON 格式,一种是 JSON 对象,另一种是 JSON 字符串?

问题描述

我有两个 Web 服务,CREATE 和 DELETE。它们都工作正常,但 JSON 结果以两种不同的格式返回。一个是字符串,一个是 JSON 对象。

'CREATE' 功能正常工作并正确显示成功消息,就像这样......

            var formData = {
                dataSourceName:$('#createDS-name').val()
            };
            var sJSON = JSON.stringify(formData);
            $.ajax({
                type : "POST",
                url : "http://localhost:8080/juliet/json/datasource/create",
                data : sJSON,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success : function(msg) {
                    alert("210: msg = "+msg);
                    alert("215: JSON.stringify(msg) = "+JSON.stringify(msg));
                    alert("220: JSON.stringify(msg.message) = "+JSON.stringify(msg.message));
                    $("#successAlert").html("<strong>Success!</strong> "+JSON.stringify(msg.message)+"</div>");
/***/

显示的警报如下所示:

210: msg = [object Object]
215: JSON.stringify(msg) = {"success":true,"message":"successfully created DataSource; id = 21"}
220: JSON.stringify(msg.message) = "successfully created DataSource; id = 21"

'DELETE' 功能也可以工作,就像这样......

            $.ajax({
                type : "DELETE",
                url : "http://localhost:8080/juliet/json/datasource/"+dataSourceId,
                contentType: "application/json; charset=utf-8",
                success : function(msg) {
                    alert("110: msg = "+msg);
                    alert("111: msg.message = "+msg.message);
                    alert("112: msg.success = "+msg.success);
                    alert("115: JSON.stringify(msg) = "+JSON.stringify(msg));
                    alert("120: JSON.stringify(msg.message) = "+JSON.stringify(msg.message));
                    $("#successAlert").html("<strong>Success:</strong> "+JSON.stringify(msg.message));
/***/

但结果(见下面的第 120 行)显示“未定义”。警报框结果如下所示...

110: msg = {"success":true,"message":"Deleted Data Source id '21'."}
111: msg.message = undefined
112: msg.success = undefined
115: JSON.stringify(msg) = "{\"success\":true,\"message\":\"Deleted Data Source id '21'.\"}"
120: JSON.stringify(msg.message) = undefined

我在 Spring Java 代码中看到的唯一区别是一个使用 RequestMethod.DELETE,另一个使用 RequestMethod.POST。

为什么我看到两个不同的结果?一个是 JSON 字符串,一个是 JSON 对象?

@RequestMapping(value = "/json/datasource/{dataSourceId}", method = RequestMethod.DELETE)
public ResponseEntity<String> deleteDataSource(@PathVariable("dataSourceId") int dataSourceId) throws Exception {
    boolean bSuccess = false;
    String sRetMsg = "Unknown error.";

    try {
        this.databaseService.deleteDataSource(dataSourceId);
        bSuccess = true;
        sRetMsg = "Deleted Data Source id '"+dataSourceId+"'.";
    } catch (Exception x) {
        bSuccess = false;
        sRetMsg = x.getMessage();
    }

    JSONObject replyObj = new JSONObject();
    replyObj.put("success", bSuccess);
    replyObj.put("message", sRetMsg);
    return new ResponseEntity<String>(replyObj.toJSONString(), (bSuccess) ? HttpStatus.OK : HttpStatus.BAD_REQUEST);    
}


@RequestMapping(value = "/json/datasource/create", method = RequestMethod.POST)
public ResponseEntity<String> createDataSource(@RequestBody String json) throws Exception {
    boolean bSuccess = false;
    String sRetMsg = "Unknown error.";

    JSONParser parser = new JSONParser();
    JSONObject jo = null;
    jo = (JSONObject) parser.parse(json);
    String dataSourceName = (String)jo.get("dataSourceName");

    if (dataSourceName == null) {

        sRetMsg = "Missing required parameter 'dataSourceName'.";

    } else 
    if (dataSourceName != null) {

        try {
            Integer id = this.databaseService.createDataSource(dataSourceName);
            bSuccess = true;
            sRetMsg = "successfully created DataSource; id = "+id.toString();
        } catch (Exception x) {
            bSuccess = false;
            sRetMsg = "ERROR: "+x.getMessage();
        }

    }
    JSONObject replyObj = new JSONObject();
    replyObj.put("success", bSuccess);
    replyObj.put("message", sRetMsg);
    return new ResponseEntity<String>(replyObj.toJSONString(), (bSuccess) ? HttpStatus.OK : HttpStatus.BAD_REQUEST);        
}

标签: javajqueryjsonspringrest

解决方案


推荐阅读