来自服务器的JSON数据无法解析。

3
我收到了"DataTables warning: JSON data from server could not be parsed. This is caused by a JSON formatting error"错误信息。我使用Java和dataTables在代码中进行输出,输出格式为JSON,但是客户端打印时无法识别。http://jsonlint.com/ 中验证的JSON对象格式正确。我不确定是什么原因导致了这个错误。
数据如下:
{"iTotalRecords":5,"sEcho":"1","aaData":[["V2993ASFKH230943","Honda","Accord"],["V2993A39SNF30943","Honda","CRV"],["V4833A39SNF30943","Acura","TSX"],["V4833RE9SNF30943","Acura","TL"],["V9383RE9SNF30943","Acura","MDX"]],"iTotalDisplayRecords":5}
非常感谢帮助。
谢谢!
try {
            JSONObject jsonResponse = new JSONObject();

            jsonResponse.put("sEcho", sEcho);
            jsonResponse.put("iTotalRecords", iTotalRecords);
            jsonResponse.put("iTotalDisplayRecords", iTotalDisplayRecords);

            while (itr.hasNext()) {
                Map rs = (Map) itr.next();
                FleetEquipment eqpmt = new FleetEquipment();
                eqpmt.setVinNumber((String) rs.get("VIN_ID"));
                eqpmt.setMake((String) rs.get("MAKE"));
                eqpmt.setModel((String) rs.get("MODEL"));
                JSONArray row = new JSONArray();
                row.put(eqpmt.getVinNumber()).put(eqpmt.getMake())
                        .put(eqpmt.getModel());
                data.put(row);

            }

            jsonResponse.put("aaData", data);

            response.setContentType("application/json");
            response.getWriter().print(jsonResponse.toString());
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response.setContentType("text/html");
            response.getWriter().print(e.getMessage());
        }

编辑 1

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<portlet:defineObjects/>

<portlet:resourceURL var="listURL" id="list" escapeXml="false"/>
<script type="text/javascript">
$(document).ready(function () {
            $('#listTable').dataTable({
                "bServerSide": true,
                "sAjaxSource": "<%=listURL.toString()%>",
                "bProcessing": true,
                "sPaginationType": "full_numbers",
                "bJQueryUI": true
            });
        });

</script></head>
<body>

<table id="listTable">
    <thead>
        <tr>
            <th>VIN ID</th>
            <th>MAKE</th>
            <th>MODEL</th>
            <th>MODEL1</th>
            <th>Model2</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>

你确定你上面提到的JSON没有任何额外的单词吗?我的意思是,没有任何错误吗? - linuxeasy
是的..我已经在我上面提到的链接中进行了验证。 - user525146
我明白你已经验证过了,但是你是否在Firebug中检查了最终结果。那是服务器的Firebug输出吗?也许你正在验证一个正确的JSON,但它并不是来自最终输出。所以你是否从最终输出中获取,比如Firebug? - linuxeasy
请您能否发布尝试在服务器端解析JSON的代码? - Henrik Andersson
是的,那就是我在Firebug中得到的响应。 - user525146
你能否通过 DataTables 调试器运行你的表格并发布调试代码,以便我们可以看到你的表格的确切状态,请访问 http://debug.datatables.net 。谢谢! - Allan Jardine
2个回答

2

enter image description here[这不是对问题的回答,而是一个工具输入]

http://jsonviewer.stack.hu/

这个工具可以帮助我们理解外部JSON对象的结构。虽然这可能不是你问题的答案,但它确实帮助我用Python代码轻松地理解和解析它,同时也是一个JSON验证器。


1
\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n VIN ID MAKE MODEL ","
status ":200,"
statusText ":"
OK "},"
fnServerData ":"
function (e, j, l, k) {\n k.jqXHR = i.ajax({
        url: e,
        data: j,
        success: function (e) {
            i(k.oInstance).trigger(\"xhr\", k);l(e);}, dataType: \"json\", cache: !1, type: k.sServerMethod, error: function (e, i) {\"parsererror\" == i && alert(\"DataTables warning: JSON data from server could not be parsed. This is caused by a JSON formatting error.\");}});\n}", "aoServerParams": [],
            "sServerMethod": "GET",
            "fnFormatNumber": "function (e) {\n if (1000 > e) {\n return e;\n }\n for (var i = e + \"\", e = i.split(\"\"), j = \"\", i = i.length, l = 0; l < i; l++) {\n 0 === l % 3 &&\n 0 !== l && (j = this.oLanguage.sInfoThousands + j), j = e[i - l - 1] + j;\n }\n return j;\n}",
            "aLengthMenu": [10, 25, 50, 100],
            "iDraw": 1,
            "bDrawing": true,
            "iDrawError": -1,
            "_iDisplayLength": 10,
            "_iDisplayStart": 0,
            "_iDisplayEnd": 0,
            "_iRecordsTotal": 0,
            "_iRecordsDisplay": 0,
            "bJUI": true,
            "oClasses": {
                "sTable": "dataTable",
                "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left",
                "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",
                "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right",
                "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",
                "sPageJUINext": "ui-icon ui-icon-circle-arrow-e",
                "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w",
                "sPageButton": "fg-button ui-button ui-state-default",
                "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled",
                "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled",
                "sPageFirst": "first ui-corner-tl ui-corner-bl",
                "sPagePrevious": "previous",
                "sPageNext": "next",
                "sPageLast": "last ui-corner-tr ui-corner-br",
                "sStripeOdd": "odd",
                "sStripeEven": "even",
                "sRowEmpty": "dataTables_empty",
                "sWrapper": "dataTables_wrapper",
                "sFilter": "dataTables_filter",
                "sInfo": "dataTables_info",
                "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",
                "sLength": "dataTables_length",
                "sProcessing": "dataTables_processing",
                "sSortAsc": "ui-state-default",
                "sSortDesc": "ui-state-default",
                "sSortable": "ui-state-default",
                "sSortableAsc": "ui-state-default",
                "sSortableDesc": "ui-state-default",
                "sSortableNone": "ui-state-default",
                "sSortColumn": "sorting_",
                "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n",
                "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s",
                "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s",
                "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n",
                "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s",
                "sSortJUIWrapper": "DataTables_sort_wrapper",
                "sSortIcon": "DataTables_sort_icon",
                "sScrollWrapper": "dataTables_scroll",
                "sScrollHead": "dataTables_scrollHead ui-state-default",
                "sScrollHeadInner": "dataTables_scrollHeadInner",
                "sScrollBody": "dataTables_scrollBody",
                "sScrollFoot": "dataTables_scrollFoot ui-state-default",
                "sScrollFootInner": "dataTables_scrollFootInner",
                "sFooterTH": "ui-state-default"
            },
            "bFiltered": true,
            "bSorted": true,
            "bSortCellsTop": false,
            "oInit": {
                "bServerSide": true,
                "sAjaxSource": "/wps/myportal/!ut/p/b1/hc09DoJAEIbhs3CCGX5kl3IRdVGiolFkG7Mho2IQEkAKTy8aGwt0ukmeLy8oSE3PctAeWY4LB1Cl7vKzbvOq1MXrV-6RBz73fVMg9-QUw0j6bCLmiGj2IO3BeCakwyJEPuImhkLumLsNLBT2v30C6psgrlhP7Jlki72Fof0BvxJvgAMnEJayulGfShUbDMUISU1Nda8zgs2pIGqjvGkhznR2oYg6Ktb6THBThRde2UMIw3gC131G1Q!!/",
                "bProcessing": true,
                "sPaginationType": "full_numbers",
                "bJQueryUI": true
            },
            "aoDestroyCallback": [],
            "fnRecordsTotal": "function () {\n return this.oFeatures.bServerSide ? parseInt(this._iRecordsTotal, 10) : this.aiDisplayMaster.length;\n}",
            "fnRecordsDisplay": "function () {\n return this.oFeatures.bServerSide ? parseInt(this._iRecordsDisplay, 10) : this.aiDisplay.length;\n}",
            "fnDisplayEnd": "function () {\n return this.oFeatures.bServerSide ? !1 === this.oFeatures.bPaginate || - 1 == this._iDisplayLength ? this._iDisplayStart + this.aiDisplay.length : Math.min(this._iDisplayStart + this._iDisplayLength, this._iRecordsDisplay) : this._iDisplayEnd;\n}",
            "sInstance": "fleetList",
            "iTabIndex": 0,
            "fnStateLoad": "function (e) {\n var e = this.oApi._fnReadCookie(e.sCookiePrefix + e.sInstance), j;\n try {\n j = \"function\" === typeof i.parseJSON ? i.parseJSON(e) : eval(\"(\" + e + \")\");\n } catch (l) {\n j = null;\n }\n return j;\n}",
            "fnStateSave": "function (e, i) {\n this.oApi._fnCreateCookie(e.sCookiePrefix + e.sInstance, this.oApi._fnJsonString(i), e.iCookieDuration, e.sCookiePrefix, e.fnCookieCallback);\n}",
            "iInitDisplayStart": -1,
            "nTableReinsertBefore": null
            }],
        "tablesDisplayData": [
            []
        ],
        "tablesDisplayExtra": [
            []
        ]
    }
    };

1
哈哈 - 它打破了DataTables调试器!哎呀。无论如何 - 在我看来,您的JSON响应包括诸如“script src = \” C:\ \ workspaces \ \ WP1 \ \ SpringPortlet \ \ WebContent \ \ jquery.dataTables.js \” ”这样的内容,这不是有效的json。在Firebug中查看响应-它包含不是JSON的内容(其中有一些JSON,但也有其他东西)。 - Allan Jardine
我已经从jsp页面中删除了那个script src,除此之外,JSON响应中包含了dataTables函数和表格数据。 - user525146
请查看以下示例以了解预期的响应:http://datatables.net/release-datatables/examples/data_sources/server_side.html - 不需要DataTables函数和响应中的表格,只需要表格数据。 - Allan Jardine
我已经在上面的问题中添加了我的JSP页面。你有什么线索或想法,为什么响应会显示表格和JavaScript?我已经苦苦挣扎了8个小时了... - user525146

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接