【问题标题】:Parsing JSON into clean HTML view将 JSON 解析为干净的 HTML 视图
【发布时间】:2016-04-13 04:45:14
【问题描述】:

我正在编写 JSON 代码。例如:

{"resultSet":{"arrival":[{"feet":null,"departed":false,"scheduled":1460553672000,"
shortSign":"34 To Oregon City TC","detoured":false,"tripID":"6317022","dir":0,
"blockID":3402,"route":34,"piece":"1","fullSign":"34 River Rd to Oregon City TC",
"id":"6317022_22872_13","vehicleID":null,"locid":10,"newTrip":false,
"status":"scheduled"}],"queryTime":1460522014873,
"location":[{"lng":-122.603190086107,"passengerCode":"E","id":10,
"dir":"Southbound","lat":45.3847203071942,"desc":"Abernethy & Barclay"}]}}

我需要将其转换为 HTML 表格视图。

但 JSON 数据可能并不总是呈现相同的结构。它可以像这样不同。

{"resultSet":{"arrival":[{"feet":50907,"inCongestion":false,"departed":false,
"scheduled":1460524334000,"loadPercentage":0,"shortSign":"78 To Beaverton TC",
"estimated":1460524334000,"detoured":false,"tripID":"6322386","dir":1,
"blockID":7672,"route":78,"piece":"1","fullSign":"78  Beaverton TC",
"id":"6322386_79934_12","vehicleID":"2918","locid":1233,"newTrip":false,
"status":"estimated"},{"feet":null,"departed":false,"scheduled":1460528004000,
"shortSign":"78 To Beaverton TC","detoured":false,"tripID":"6322387","dir":1,
"blockID":7867,"route":78,"piece":"1","fullSign":"78  Beaverton TC",
"id":"6322387_83604_12","vehicleID":null,"locid":1233,"newTrip":false,
"status":"scheduled"},{"feet":null,"departed":false,"scheduled":1460557107000,
"shortSign":"37 To Tualatin P&R","detoured":false,"tripID":"6317319","dir":0,
"blockID":3767,"route":37,"piece":"1",
"fullSign":"37  Lake Grove to Tualatin Park & Ride","id":"6317319_26307_13",
"vehicleID":null,"locid":1233,"newTrip":false,"status":"scheduled"}],
"queryTime":1460522323801,"location":[{"lng":-122.697651868185,
"passengerCode":"E","id":1233,"dir":"Westbound","lat":45.423844983607,
"desc":"Country Club & Wembley Park"}]}}

如何在 HTML 表格视图中实现结果?

【问题讨论】:

  • 嗯,这两个例子实际上并没有不同的结构。第二个在其arrival 数组中有多个对象。因此,HTML 结果将是一个表格,您将在其中显示属于一行的子表格。一种处理方法是在一个表中显示所有数据,在非重复列中使用老式的rowspan 属性。
  • 你能举一个HTML代码的例子吗?我应该能够从那里继续前进。谢谢,

标签: html arrays json geojson


【解决方案1】:

恐怕这很优雅,但我最终还是得到了解决方案。 ;-)

也许您可以使用一些想法...(例如使用函数 getkeys() 收集属性...)

// first test case:
var dat={"resultSet":{"arrival":[{"feet":50907,"inCongestion":false,"departed":false,
"scheduled":1460524334000,"loadPercentage":0,"shortSign":"78 To Beaverton TC",
"estimated":1460524334000,"detoured":false,"tripID":"6322386","dir":1,
"blockID":7672,"route":78,"piece":"1","fullSign":"78  Beaverton TC",
"id":"6322386_79934_12","vehicleID":"2918","locid":1233,"newTrip":false,
"status":"estimated"},{"feet":null,"departed":false,"scheduled":1460528004000,
"shortSign":"78 To Beaverton TC","detoured":false,"tripID":"6322387","dir":1,
"blockID":7867,"route":78,"piece":"1","fullSign":"78  Beaverton TC",
"id":"6322387_83604_12","vehicleID":null,"locid":1233,"newTrip":false,
"status":"scheduled"},{"feet":null,"departed":false,"scheduled":1460557107000,
"shortSign":"37 To Tualatin P&R","detoured":false,"tripID":"6317319","dir":0,
"blockID":3767,"route":37,"piece":"1",
"fullSign":"37  Lake Grove to Tualatin Park & Ride","id":"6317319_26307_13",
"vehicleID":null,"locid":1233,"newTrip":false,"status":"scheduled"}],
"queryTime":1460522323801,"location":[{"lng":-122.697651868185,
"passengerCode":"E","id":1233,"dir":"Westbound","lat":45.423844983607,
"desc":"Country Club & Wembley Park"}]}};
// second test case with missing "arrival" sub-array:
var dat ={"resultSet":{"queryTime":1460959167994,"location":[{"lng":-122.79683594921,
          "pas‌​sengerCode":"E","id":997,"dir":"Southbound",
          "lat":45.506252040801,"desc":"SW Cedar Hills & Berkshire"}]}};

var maxr=0;
function getkeys(arr) { var keys={};
  // the following "if ... else" was added to deal with missing sub-arrays:                      
  if (arr) {arr.forEach(function(o,i){for (a in o) keys[a]=1;});
  var ret=Object.keys(keys); if ((ret.len=arr.length)>maxr)  maxr=ret.len;
  } else ret=[];
  // ret.len is the number of rows found in the array arr
  // and should not be confused with ret.length (=the length of ret)
  return ret;
}
var rs=dat.resultSet,
    okeys={rs:getkeys([rs]),arrival:getkeys(rs.arrival),location:getkeys(rs.location)};

// first title row
var r=[okeys.rs.map(function(rk){
       return '<th'+(okeys[rk]?' colspan="'+okeys[rk].length+'"':'')+'>'+rk+'</th>';}).join('')],
    tmp=[];

// second title row
okeys.rs.forEach(function(rk){
       if (okeys[rk]) [].push.apply(tmp,okeys[rk]); // push a group of columns
       else           tmp.push(rk);                 // push a single column into array tmp
});
r.push('<td>'+tmp.join('</td><td>')+'</td>');

// data rows
for (i=0;i<maxr;i++){ tmp=[];
 okeys.rs.forEach(function(rk){var ok=okeys[rk],l,td;
   if (ok) { l=ok.len; td='<td'+(maxr>l && l==i+1?' rowspan="'+(maxr-i)+'">':'>');   
     if (i<l) [].push.apply(tmp,ok.map(function(k){return td+(rs[rk][i][k]||'')+'</td>';}));
   }
   else if (!i) tmp.push('<td rowspan="'+maxr+'">'+rs[rk]+'</td>');  // push a single column into array tmp
 });
r.push(tmp.join(''));                     
}
// output onto page
document.getElementById("out").innerHTML=
  '<table><tr>'+r.join('</tr>\n<tr>')+'</tr></table>';
th,td {border: solid 1px}
&lt;div id="out"&gt;&lt;/div&gt;

编辑:
我刚刚在getkeys() 函数中添加了一个if ... else 块来处理okeys-object 中定义的并非所有子数组都存在于dat 中的情况。在最新的测试用例中,子数组“arrival”丢失了。

【讨论】:

  • 伟大的一步!看起来挺好的。我检查了 {"resultSet":{"queryTime":1460959167994,"location":[{"lng":-122.79683594921,"passengerCode":"E","id":997,"dir":"Southbound", "lat":45.506252040801,"desc":"SW Cedar Hills & Berkshire"}]}} 它不起作用...可能是什么问题?
  • @asax:查看我的最新编辑。问题是 getkeys() 函数中的“未定义数组 arr”。此问题现已修复。
  • 这很有帮助。还有几个问题:表格显示后……我们可以用两列/两行显示以下数据吗?从 TripID、英尺、出发、预定、shortSign、完整符号、blockID、路线、车辆 ID、状态、查询时间、[lat,lng]、dir、desc 开始?基本上一方面是问题,另一方面是相关答案....谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-08-09
  • 2012-12-03
  • 2021-12-26
  • 2010-12-31
  • 2019-09-27
  • 2018-02-13
  • 1970-01-01
  • 2019-08-29
相关资源
最近更新 更多