使用 for 循环解析 JavaScript 中的 JSON
A] 问题摘要:
我有 JSON 数据从 python 返回到 javascript。我想遍历 JSON 结构并打印 html 表中的数据元素。
B] 代码摘录:
1] 从 python 返回的 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]我尝试通过数据结构进行解析并在预先准备好的 HTML 表“#datatable_for_current_users”的“tbody”中打印数据元素的 JavaScript 代码
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 循环的上限是
多少] 我不确定我是否在内部正确访问“城市”变量for 循环。
[EDIT#1]
根据 Salman 和 Pointy 给出的响应,我必须检查返回 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 结构获取 for 循环。
[EDIT#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 完成的。
A] Problem summary:
I have JSON data being returned from python to javascript. I want to go thru the JSON structure and print the data elements in a html table.
B] Code excerpts:
1] JSON being returned from python --
{'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}
},
]'
}
Note this is a single city, like this there are many city elements in the JSON data.
2] Javascript code that I tried for parsing thru the data-structure and printing data elements in the “tbody” of a pre-ready HTML table “#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);
}
}
Problems i am having the javascript code are :
1] I am unable to find the exact length of the city elements in the "data" because of which i dont know what the upper bound of the for loop is
2] I am not sure whether i am accessing the "city" variable correctly inside the for loop.
[EDIT#1]
Based on the response given by Salman and Pointy, i had to inspect the python code that was returning the json data. After some debugging it was found that the JSON data was being returned using templates because of which the template name was occuring in the JSON data. I changed the mechanism of sending JSON and now the following is how the returned JSON data looks like
[{"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}}]
I am still struggling to get a for loop around this json structure.
[EDIT#2]
After some debugging and response give by @Salman, the following function does the job
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);
}
}
One problem i found while debugging was the JSON returned was in string format and had to be converted to a JSON object, this was done using jQuery.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您似乎正在使用 jQuery。如果您想从 JSON 数据直接生成 HTML,一种简单的解决方案是通过插件使用简单的模板,例如 jQote2 。它提供了一种简单的语法,可以循环访问您的数据。使用 JS 模板还可以更轻松地维护 HTML 结构。
You seem to be using jQuery. If you want to generate straight HTML from JSON data, one easy solution is to use simple templates through plugin, like jQote2. It provides an easy syntax, that loops through your data. Using JS templates also makes it easier to maintain your HTML structure.
奇怪的是,似乎
data_for_users_city
不是数组而是一个字符串。我希望这不是拼写错误或复制/粘贴错误。编辑 1
即使您将其视为字符串,您的 JSON 仍然有错误。 JavaScript 中不允许在引号内换行,必须将其替换为
\n
,使用+
连接运算符或使用\
分割字符串在多行上。如果您设法解决这些问题,您可以执行以下操作:编辑 2
这是我在 FireFox/Firebug 控制台中创建和测试的一个快速而肮脏的演示。它基本上演示了如何访问 JSON 中的三个级别的数据。要正确可视化您的 JSON 数据,请复制以下代码并粘贴到 jsbeautifier 中。
Strange, it seems like
data_for_users_city
is not and array but a string. I hope this is not a typo or copy/paste error.Edit 1
Even when you treat it as a string, your JSON still has errors. Newlines inside quotes are not allowed in JavaScript, you must replace them with
\n
, use the+
concatenation operator or use\
to split the string on multiple lines. In case you manage to workaround these problems, you can do a:EDIT 2
This is a quick and dirty demo that I created and tested in FireFox/Firebug console. It basically demonstrates how you can access the three levels of data inside the JSON. To visualize your JSON data properly, copy the following code and paste in jsbeautifier.
您是否考虑过使用 Javascript 模板引擎将 JSON 转换为 HTML?
我是 pure.js 的作者,它非常原创,但是有很多经典的双括号引擎可用的。
Did you consider using a Javascript template engine for converting JSON to HTML?
I'm the author of pure.js which is quite original, but there are plenty of classical double-brackets-engines available.
如果您使用 jQuery,请考虑使用 var json = $.parseJSON(data)。这会将您的 JSON 字符串转换为 JSON 对象。
尝试一下。它应该会让你更容易到达你的物体。
If you are using jQuery consider using the
var json = $.parseJSON(data)
. This will convert your JSON string into a JSON object.Try it out. It should make getting to your objects a lot easier.