簡體   English   中英

遞歸遍歷未知的json對象/樹和基於返回的json的操作

[英]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&auml; '+varlen+' arvoa)</b>';
                    } else {
                        html += '<i>'+data.variables[i].valueTexts.join(',')+'</i>';
                   }
                    html += '<br/>';

                }

                $(html+'<br>').appendTo($('#tab2'));
            });
            }

編輯:此刻似乎是每個for循環在開始另一個循環之前。 因此,它開始一個循環,如果另一個被初始化,則在第一個完成之前不會運行。

主循環內部循環1內部循環2 <-這不是首先應該做的嗎?

  1. loopApiUrl變量作為函數recursePxJson()的參數進行處理。

  2. 擺脫無用的recursion布爾值。


您可能會發現拋棄jQuery並使用普通的舊XMLHTTPRequest更容易。 您的代碼將稍長一些, 但是您將更好地控制自己的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM