[英]Recursive traversal of unknown json object/tree and actions based on returned json
我正在使用一個可應要求返回JSON的API。 此JSON具有下一級URL的名稱或文件名。
問題在於代碼必須識別返回了哪個JSON。
如果JSON僅具有下一個URL級別的名稱,則創建URL並獲取它。 然后以遞歸的方式獲取一組新的名稱或文件,進行識別並重新進行。 可以根據需要將菜單級別調高。 1至*
如果它具有文件名,則應獲取它並將其呈現為html。 (已經解決)
json的例子
{id: 'New_url_1_level_1', id:'New_url_2_level_1', id:'New_url_3_level_1'}
//or
{id:'001200.file.ext',id:'001300.file.ext'...}
這些將變成http://my.api.call.com/New_url_1_level_1.../New_url1_level_2/ ...
問題是如何循環訪問URL並最終獲得文件名,例如: http : //my.api.call.com/New_url_1_level_1/New_url_1_level_2/New_url_1_level_3/001300.file.ext
我當前的腳本是:
var json;
var urllevel= '/First_level';
var api = 'http://my.api.call.com';
var re = /^\d+/g; // Regex to match filename (decide if json has filenames or urls; files always start with digits or end with extension)
var loopApiUrl = new Array();
var recursion = false;
// This is the problem - how to recursively build url's based on returned data i.e. traverse a "unknown" tree
function recursePxJson(){
if (!recursion) {
loopApiUrl = [];
}
// Get JSON
$.get(api+urllevel+'/'+loopApiUrl.join('/'),function(data,status){
for (var i in data) {
if (!re.test(data[i].id)) { // {id: 'This_is_to_be_appended_to_url', id:'Another_appendable'}
recursion = true;
loopApiUrl.push(data[i].id);
recursePxJson();
}
else { // {id:'001200.file.ext',id:'001300.file.ext'}
load(api+urllevel+'/'+loopApiUrl.join('/')+'/'+data[i].id);
recursion = false;
}
}
});
//loadDBS(param);
}
// Load renderable JSON - ALREADY SOLVED
function load(param){
$.get(param, function(data, status){
json = JSON.stringify(data);
var title = data.title.split(':');
html = '<h2>'+title[0]+'</h2>';
html += '<h3>'+title[1]+'</h3>';
html += '<h5>Values:</h5>';
for (var i=0; i<data.variables.length; i++) {
html += '<b>'+data.variables[i].text+': </b>';
varlen = data.variables[i].valueTexts.length;
if (varlen > 6) {
html += '<i>'+data.variables[i].valueTexts[0]+', '+data.variables[i].valueTexts[1]+', '+data.variables[i].valueTexts[2]+' . . . '+data.variables[i].valueTexts[varlen-3]+', '+data.variables[i].valueTexts[varlen-2]+', '+data.variables[i].valueTexts[varlen-1]+'</i>'+'<b> (yhteensä '+varlen+' arvoa)</b>';
} else {
html += '<i>'+data.variables[i].valueTexts.join(',')+'</i>';
}
html += '<br/>';
}
$(html+'<br>').appendTo($('#tab2'));
});
}
編輯:此刻似乎是每個for循環在開始另一個循環之前。 因此,它開始一個循環,如果另一個被初始化,則在第一個完成之前不會運行。
主循環內部循環1內部循環2 <-這不是首先應該做的嗎?
將loopApiUrl
變量作為函數recursePxJson()
的參數進行處理。
擺脫無用的recursion
布爾值。
您可能會發現拋棄jQuery並使用普通的舊XMLHTTPRequest更容易。 您的代碼將稍長一些, 但是您將更好地控制自己的工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.