JSON对Datatables的回应?

时间:2016-09-14 13:44:09

标签: jquery json ajax datatables

我有以下示例从Ajax调用获取XML响应并附加到表。

$("#ajaxform5").submit(function(e) {
    var formURL = $(this).attr("action");
    var request = $.ajax({
        url : formURL,
        type: "GET",
        contentType : "application/xml",
        headers: {
            "Type" : "events"
        },
        success: function(xml){
            $(xml).find('event').each(function(){
                var $event = $(this);
                var id = $event.find("id").text();
                var level = $event.find("level").text();
                var name = $event.find("name").text();
                var attributes01 = $event.find("attributes").children("entry").eq(0).children("string").eq(0).text();
                var attributes02 = $event.find("attributes").children("entry").eq(0).children("string").eq(1).text();
                var attributes11 = $event.find("attributes").children("entry").eq(1).children("string").eq(0).text();
                var attributes12 = $event.find("attributes").children("entry").eq(1).children("string").eq(1).text();
                var attributes21 = $event.find("attributes").children("entry").eq(2).children("string").eq(0).text();
                var attributes22 = $event.find("attributes").children("entry").eq(2).children("string").eq(1).text();
                var attributes31 = $event.find("attributes").children("entry").eq(3).children("string").eq(0).text();
                var attributes32 = $event.find("attributes").children("entry").eq(3).children("string").eq(1).text();
                var attributes41 = $event.find("attributes").children("entry").eq(4).children("string").eq(0).text();
                var attributes42 = $event.find("attributes").children("entry").eq(4).children("string").eq(1).text();
                var userId = $event.find("userId").text();
                var ipaddress = $event.find("ipaddress").text();
                var outcome = $event.find("outcome").text();
                var html = '<tr><td>' + id + '</td><td>' + level + '</td><td>' + name + '</td><td>' +
                    '<div><span class="title">' + attributes01 + '</span> <span>' + attributes02 + '</span></div>' +
                    '<div><span class="title">' + attributes11 + '</span> <span>' + attributes12 + '</span></div>' +
                    '<div><span class="title">' + attributes21 + '</span> <span>' + attributes22 + '</span></div>' +
                    '<div><span class="title">' + attributes31 + '</span> <span>' + attributes32 + '</span></div>' +
                    '<div><span class="title">' + attributes41 + '</span> <span>' + attributes42 + '</span></div>' +
                    '</td><td>' + userId + '</td><td>' + ipaddress + '</td><td>' + outcome + '</td></tr>';
                $('#eventTable').append(html);
            });
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert(textStatus);
        }
    });
});

现在我想使用Datatables。所以我用xml2json(abdmob / x2js)将响应XML转换为JSON,我在下面得到了JSON响应。

JSON响应;

{
    "list" : {
        "event" : [{
                "dateTime" : "1473858435162",
                "nanoTime" : "438326047248251",
                "id" : "15680",
                "eventTime" : {
                    "time" : "1473851193487",
                    "timezone" : "Asia/Istanbul"
                },
                "level" : "INFORMATION",
                "name" : "Get message content",
                "attributes" : {
                    "entry" : [{
                            "string" : ["metaDataIds", "6"]
                        }, {
                            "string" : ["messageId", "2765"]
                        }, {
                            "string" : ["channel", "Channel[id=44ab0667-d42c-496c-bca2-2bd7eecd6dc9,name=API jQuery Direct]"]
                        }
                    ],
                    "_class" : "linked-hash-map"
                },
                "outcome" : "SUCCESS",
                "userId" : "1",
                "ipAddress" : "127.0.0.1",
                "serverId" : "f85e48e2-32b3-429f-bee5-31630d8143a2"
            }, {
                "dateTime" : "1473858435167",
                "nanoTime" : "438326052034149",
                "id" : "15679",
                "eventTime" : {
                    "time" : "1473851191973",
                    "timezone" : "Asia/Istanbul"
                },
                "level" : "INFORMATION",
                "name" : "Get messages by page limit",
                "attributes" : {
                    "entry" : [{
                            "string" : ["filter", "MessageFilter[maxMessageId=2765,minMessageId=<null>,originalIdUpper=<null>,originalIdLower=<null>,importIdUpper=<null>,importIdLower=<null>,startDate=<null>,endDate=<null>,textSearch=<null>,textSearchRegex=<null>,statuses=<null>,includedMetaDataIds=[6],excludedMetaDataIds=<null>,serverId=<null>,contentSearch=[],metaDataSearch=<null>,textSearchMetaDataColumns=<null>,sendAttemptsLower=<null>,sendAttemptsUpper=<null>,attachment=false,error=false]"]
                        }, {
                            "string" : ["includeContent", "false"]
                        }, {
                            "string" : ["offset", "0"]
                        }, {
                            "string" : ["limit", "21"]
                        }, {
                            "string" : ["channel", "Channel[id=44ab0667-d42c-496c-bca2-2bd7eecd6dc9,name=API jQuery Direct]"]
                        }
                    ],
                    "_class" : "linked-hash-map"
                },
                "outcome" : "SUCCESS",
                "userId" : "1",
                "ipAddress" : "127.0.0.1",
                "serverId" : "f85e48e2-32b3-429f-bee5-31630d8143a2"
            }
        ]
    }
}


所以我的第一个问题是,这个JSON响应对DataTables有效吗? 如果它是有效的,我如何在第一个例子中将对象和数组处理为行/列?

我尝试将JSON响应插入Datatables,但我不能。你可以在图片中看到结果。 response added to rows char by char

我给出了下面的代码仅供参考,你不想知道我输入了多少数据。
我也试过了columns.data选项来读取数组但是又失败了。

$("#ajaxform6").submit(function(e) {
    var formURL = $(this).attr("action");
    var request = $.ajax({
        url : formURL,
        type: "GET",
        contentType : "application/xml",
        headers: {
            "Type" : "events"
        },
        success: function(data, textStatus, jqXHR) {
            var x2js = new X2JS();
            var bXML = jqXHR.responseText;
            var jsonObj = x2js.xml_str2json(bXML);
            var json = JSON.stringify(jsonObj);
            console.log(json);
            $('#table_id').DataTable( {
                data: json,
                bSort: false,
            } );
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert(textStatus);
        }
    });
});

2 个答案:

答案 0 :(得分:1)

收到您的json数据,因为响应有效,可以解析为datatable

您可以使用json数据来参考我创建的以下DataTable代码:

&#13;
&#13;
var jsdata = {
		"list" : {
			"event" : [
					{
						"dateTime" : "1473858435162",
						"nanoTime" : "438326047248251",
						"id" : "15680",
						"eventTime" : {
							"time" : "1473851193487",
							"timezone" : "Asia/Istanbul"
						},
						"level" : "INFORMATION",
						"name" : "Get message content",
						"attributes" : {
							"entry" : [
									{
										"string" : [ "metaDataIds", "6" ]
									},
									{
										"string" : [ "messageId", "2765" ]
									},
									{
										"string" : [ "channel",
												"Channel[id=44ab0667-d42c-496c-bca2-2bd7eecd6dc9,name=API jQuery Direct]" ]
									} ],
							"_class" : "linked-hash-map"
						},
						"outcome" : "SUCCESS",
						"userId" : "1",
						"ipAddress" : "127.0.0.1",
						"serverId" : "f85e48e2-32b3-429f-bee5-31630d8143a2"
					},
					{
						"dateTime" : "1473858435167",
						"nanoTime" : "438326052034149",
						"id" : "15679",
						"eventTime" : {
							"time" : "1473851191973",
							"timezone" : "Asia/Istanbul"
						},
						"level" : "INFORMATION",
						"name" : "Get messages by page limit",
						"attributes" : {
							"entry" : [
									{
										"string" : [
												"filter",
												"MessageFilter[maxMessageId=2765,minMessageId=<null>,originalIdUpper=<null>,originalIdLower=<null>,importIdUpper=<null>,importIdLower=<null>,startDate=<null>,endDate=<null>,textSearch=<null>,textSearchRegex=<null>,statuses=<null>,includedMetaDataIds=[6],excludedMetaDataIds=<null>,serverId=<null>,contentSearch=[],metaDataSearch=<null>,textSearchMetaDataColumns=<null>,sendAttemptsLower=<null>,sendAttemptsUpper=<null>,attachment=false,error=false]" ]
									},
									{
										"string" : [ "includeContent", "false" ]
									},
									{
										"string" : [ "offset", "0" ]
									},
									{
										"string" : [ "limit", "21" ]
									},
									{
										"string" : [ "channel",
												"Channel[id=44ab0667-d42c-496c-bca2-2bd7eecd6dc9,name=API jQuery Direct]" ]
									} ],
							"_class" : "linked-hash-map"
						},
						"outcome" : "SUCCESS",
						"userId" : "1",
						"ipAddress" : "127.0.0.1",
						"serverId" : "f85e48e2-32b3-429f-bee5-31630d8143a2"
					} ]
		}
	};

	$(document).ready(function() {
		$('#table_id').DataTable({
			data : jsdata.list.event,
			columns : [ {
				title : "Id",
				data : 'id'
			}, {
				title : "Level",
				data : 'level'
			}, {
				title : "Name",
				data : 'name'
			}, {
				title : "UserId",
				data : 'userId'
			}, {
				title : "Ip Address",
				data : 'ipAddress'
			}

			]
		});
	});
&#13;
<link href="https://cdn.datatables.net/1.10.12/css/jquery.dataTables.min.css" rel="stylesheet"/>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<script src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script>


<table id="table_id" class="display" width="100%"></table>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

  • 您无需使用JSON.stringify
  • 您需要为columns.data属性
  • 的每列指定数据属性

2列表的示例代码如下所示。为其他列添加更多column.data条目。

$('#table_id').DataTable( {
   data: jsonObj.list.event,
   columns: [
      { data: 'name' },
      { data: 'level' }
   ]
});