繁体   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