2011-04-19 43 views
0

A]问题摘要:解析JSON在JavaScript使用用于循环

我已经从蟒返回到JavaScript的JSON数据。我想穿过JSON结构并在html表格中打印数据元素。

B]代码摘录:从蟒被返回

1] JSON -

{'data_for_users_city': 
'[ 
    {"city": 
      {"city_name": "Boston", 
      "country": {"country_name": "United States"} 
      }, 
      "status": true, 
      "date_time": {"ctime": "Thu Apr 7 09:38:00 2011", "hour": 9, "isoweekday": 4, "month": 4, "second": 0, "microsecond": 796000, "isocalendar": [2011, 14, 4], "timetuple": [2011, 4, 7, 9, 38, 0, 3, 97, -1], "year": 2011, "epoch": 1302169080.0, "isoformat": "2011-04-07T09:38:00.796000", "day": 7, "minute": 38} 
    }, 
    ]' 
} 

注意,这是一个城市,这样有在JSON数据许多城市元素。

2]的Javascript代码,我试图在预先准备的HTML表格的“TBODY”解析通该数据结构和打印数据元素“#datatable_for_current_users”

function LoadUsersDatatable(data) { 
    var tbody = $("#datatable_for_current_users > tbody").html(""); 

    for (var i=0; i < data.length; i++) 
    { 
     var city = data.data_for_users_city[i]; 
     var rowText = "<tr class='gradeA'><td>" + city.county.country_name + "</td><td>" + city.city_name + "</td><td>" + city.status + "</td><td>" + city.date_time.ctime + "</td></tr>"; 

      $(rowText).appendTo(tbody); 
} 
}  

问题我有所述JavaScript代码是:

1]我无法找到在“数据”的城市元素的准确长度,因为这些我不知道上限的for循环是什么

2]我不知道我是否正在访问“城市”VA for循环内正确rible。

[EDIT#1]

基于由Salman和尖给出的响应,我不得不检查这是返回JSON数据的Python代码。经过一些调试后,发现JSON数据正在使用模板返回,因为模板名称在JSON数据中发生。我改变了发送JSON的机制,现在下面是返回的JSON数据的样子

[{"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 1, "status": true, "date_time": {"ctime": "Thu Apr 7 09:38:00 2011", "hour": 9, "isoweekday": 4, "month": 4, "second": 0, "microsecond": 796000, "isocalendar": [2011, 14, 4], "timetuple": [2011, 4, 7, 9, 38, 0, 3, 97, -1], "year": 2011, "epoch": 1302169080.0, "isoformat": "2011-04-07T09:38:00.796000", "day": 7, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 2, "status": false, "date_time": {"ctime": "Thu Apr 7 09:38:03 2011", "hour": 9, "isoweekday": 4, "month": 4, "second": 3, "microsecond": 359000, "isocalendar": [2011, 14, 4], "timetuple": [2011, 4, 7, 9, 38, 3, 3, 97, -1], "year": 2011, "epoch": 1302169083.0, "isoformat": "2011-04-07T09:38:03.359000", "day": 7, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 3, "status": true, "date_time": {"ctime": "Thu Apr 7 09:38:08 2011", "hour": 9, "isoweekday": 4, "month": 4, "second": 8, "microsecond": 281000, "isocalendar": [2011, 14, 4], "timetuple": [2011, 4, 7, 9, 38, 8, 3, 97, -1], "year": 2011, "epoch": 1302169088.0, "isoformat": "2011-04-07T09:38:08.281000", "day": 7, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 4, "status": false, "date_time": {"ctime": "Thu Apr 7 09:38:14 2011", "hour": 9, "isoweekday": 4, "month": 4, "second": 14, "microsecond": 578000, "isocalendar": [2011, 14, 4], "timetuple": [2011, 4, 7, 9, 38, 14, 3, 97, -1], "year": 2011, "epoch": 1302169094.0, "isoformat": "2011-04-07T09:38:14.578000", "day": 7, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 13, "status": true, "date_time": {"ctime": "Wed Apr 13 01:37:58 2011", "hour": 1, "isoweekday": 3, "month": 4, "second": 58, "microsecond": 343000, "isocalendar": [2011, 15, 3], "timetuple": [2011, 4, 13, 1, 37, 58, 2, 103, -1], "year": 2011, "epoch": 1302658678.0, "isoformat": "2011-04-13T01:37:58.343000", "day": 13, "minute": 37}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 14, "status": false, "date_time": {"ctime": "Wed Apr 13 01:38:01 2011", "hour": 1, "isoweekday": 3, "month": 4, "second": 1, "microsecond": 78000, "isocalendar": [2011, 15, 3], "timetuple": [2011, 4, 13, 1, 38, 1, 2, 103, -1], "year": 2011, "epoch": 1302658681.0, "isoformat": "2011-04-13T01:38:01.078000", "day": 13, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 23, "status": true, "date_time": {"ctime": "Sun Apr 17 21:24:18 2011", "hour": 21, "isoweekday": 7, "month": 4, "second": 18, "microsecond": 625000, "isocalendar": [2011, 15, 7], "timetuple": [2011, 4, 17, 21, 24, 18, 6, 107, -1], "year": 2011, "epoch": 1303075458.0, "isoformat": "2011-04-17T21:24:18.625000", "day": 17, "minute": 24}}] 

我仍然在努力得到了解决此JSON结构循环。

[编辑#2]

经过一番调试和响应由@Salman给下面的函数做这项工作

function LoadUsersDatatable(data) { 
            var tbody = $("#datatable_for_current_users > tbody").html(""); 
            jsonData = jQuery.parseJSON(data); 

            for (var i = 0; i < jsonData.length; i++) 
            { 
             var citydata = jsonData[i]; 
             var rowText = "<tr class='gradeA'><td>" + citydata.city.country.country_name + "</td><td>" + citydata.city.city_name + "</td><td>" + citydata.status + "</td><td>" + citydata.date_time.ctime + "</td></tr>"; 
             $(rowText).appendTo(tbody); 
            } 

           }  

的一个问题,我发现在调试时是JSON返回的是字符串格式,必须转换为JSON对象,这是使用jQuery完成的。

+1

解析您发布的代码时,出现“未终止的字符串文字”错误。这是一个复制粘贴错误? – 2011-04-19 12:09:56

+2

这不是JSON。 http://jsonlint.com/(你可能希望data_for_users_city的值是一个数组,而不是一个字符串) – Quentin 2011-04-19 12:11:15

+2

正如@David Dorward所说,你的“JSON”是无效的。首先,所有报价必须用双引号,而不是单引号。其次,这不是那么“无效”,只是错误,“data_for_users_city”的价值应该不是这样完全引用的 - 它违背了使用JSON作为编码的全部目的。 – Pointy 2011-04-19 12:19:46

回答

1

奇怪的是,它好像data_for_users_city不是数组而是一个字符串。我希望这不是错字或复制/粘贴错误。

编辑1

即使你把它作为一个字符串,你JSON仍然有错误。在JavaScript中不允许使用引号内的换行符,您必须用\n替换它们,使用+并置运算符或使用\将字符串拆分为多行。如果您管理要解决这些问题,你可以做:

var data_for_users_city = eval(data.data_for_users_city); 
// sometimes adding extra parenthesis help 
// var data_for_users_city = eval('(' + data.data_for_users_city + ')'); 
alert(data_for_users_city.length); 

EDIT 2

这是我创建并在Firefox/Firebug的控制台测试了一个快速和肮脏的演示。它基本上演示了如何访问JSON中的三个级别的数据。要正确显示您的JSON数据,请复制以下代码并粘贴到jsbeautifier

var data = [{"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 1, "status": true, "date_time": {"ctime": "Thu Apr 7 09:38:00 2011", "hour": 9, "isoweekday": 4, "month": 4, "second": 0, "microsecond": 796000, "isocalendar": [2011, 14, 4], "timetuple": [2011, 4, 7, 9, 38, 0, 3, 97, -1], "year": 2011, "epoch": 1302169080.0, "isoformat": "2011-04-07T09:38:00.796000", "day": 7, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 2, "status": false, "date_time": {"ctime": "Thu Apr 7 09:38:03 2011", "hour": 9, "isoweekday": 4, "month": 4, "second": 3, "microsecond": 359000, "isocalendar": [2011, 14, 4], "timetuple": [2011, 4, 7, 9, 38, 3, 3, 97, -1], "year": 2011, "epoch": 1302169083.0, "isoformat": "2011-04-07T09:38:03.359000", "day": 7, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 3, "status": true, "date_time": {"ctime": "Thu Apr 7 09:38:08 2011", "hour": 9, "isoweekday": 4, "month": 4, "second": 8, "microsecond": 281000, "isocalendar": [2011, 14, 4], "timetuple": [2011, 4, 7, 9, 38, 8, 3, 97, -1], "year": 2011, "epoch": 1302169088.0, "isoformat": "2011-04-07T09:38:08.281000", "day": 7, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 4, "status": false, "date_time": {"ctime": "Thu Apr 7 09:38:14 2011", "hour": 9, "isoweekday": 4, "month": 4, "second": 14, "microsecond": 578000, "isocalendar": [2011, 14, 4], "timetuple": [2011, 4, 7, 9, 38, 14, 3, 97, -1], "year": 2011, "epoch": 1302169094.0, "isoformat": "2011-04-07T09:38:14.578000", "day": 7, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 13, "status": true, "date_time": {"ctime": "Wed Apr 13 01:37:58 2011", "hour": 1, "isoweekday": 3, "month": 4, "second": 58, "microsecond": 343000, "isocalendar": [2011, 15, 3], "timetuple": [2011, 4, 13, 1, 37, 58, 2, 103, -1], "year": 2011, "epoch": 1302658678.0, "isoformat": "2011-04-13T01:37:58.343000", "day": 13, "minute": 37}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 14, "status": false, "date_time": {"ctime": "Wed Apr 13 01:38:01 2011", "hour": 1, "isoweekday": 3, "month": 4, "second": 1, "microsecond": 78000, "isocalendar": [2011, 15, 3], "timetuple": [2011, 4, 13, 1, 38, 1, 2, 103, -1], "year": 2011, "epoch": 1302658681.0, "isoformat": "2011-04-13T01:38:01.078000", "day": 13, "minute": 38}}, {"city": {"city_name": "Framingham", "country": {"country_name": "United States", "id": null}, "id": null}, "id": 23, "status": true, "date_time": {"ctime": "Sun Apr 17 21:24:18 2011", "hour": 21, "isoweekday": 7, "month": 4, "second": 18, "microsecond": 625000, "isocalendar": [2011, 15, 7], "timetuple": [2011, 4, 17, 21, 24, 18, 6, 107, -1], "year": 2011, "epoch": 1303075458.0, "isoformat": "2011-04-17T21:24:18.625000", "day": 17, "minute": 24}}]; 
var table = $("<table border='1'/>"); 
var thead = $("<thead/>") 
    .appendTo(table); 
$("<tr/>") 
    .append("<th>Country</th>") 
    .append("<th>City</th>") 
    .append("<th>Status</th>") 
    .append("<th>Time</th>") 
    .appendTo(thead); 
var tbody = $("<tbody/>") 
    .appendTo(table); 
for (var i = 0; i < data.length; i++) { 
    var citydata = data[i]; 
    $("<tr/>") 
     .append("<td>" + citydata.city.country.country_name + "</td>") 
     .append("<td>" + citydata.city.city_name + "</td>") 
     .append("<td>" + citydata.status + "</td>") 
     .append("<td>" + citydata.date_time.ctime + "</td>") 
     .appendTo(tbody); 
} 
// 
// FOR TESTING 
// 
$("body").append(table); 
+0

和原因? – 2011-04-19 12:07:41

+0

@Salman A我没有倒下,但我怀疑有人可能会对使用“eval()”的建议感到不满。因为你指出数据的严重问题,实际上,我提高了:-) – Pointy 2011-04-19 12:18:07

+0

是的。如果eval是(我)推荐使用jQuery.parseJSON()代替的问题。 – 2011-04-19 12:23:06

2

您似乎在使用jQuery。如果你想从JSON数据生成直接的HTML,一个简单的解决方案是通过插件使用简单的模板,如jQote2。它提供了一种简单的语法,可以循环使用数据。使用JS模板还可以更轻松地维护HTML结构。

0

您是否考虑过使用JavaScript模板引擎将JSON转换为HTML?

我是pure.js的作者,这是很原始的,但有很多经典的双括号引擎可用。

0

如果您使用的是jQuery,请考虑使用var json = $.parseJSON(data)。这会将您的JSON字符串转换为JSON对象。

试一试。它应该让你的对象更容易。