2016-05-09 6 views
0

私はリクエストに応じてJSONを返すAPIを使用しています。このJSONには、次のレベルのURLの名前またはファイル名のいずれかがあります。未知のjsonオブジェクト/ツリーの再帰的なトラバーサルと返されたjsonに基づくアクション

問題は、コードがどのJSONが返されるかを認識することです。

JSONに次のURLレベルの名前しかない場合は、URLを作成して取得します。 その後、再帰的に名前やファイルの新しいセットを取得し、認識して実行します。必要に応じて深くメニューレベルにすることができます。 1〜*

ファイル名がある場合は、それを取得してhtmlとしてレンダリングする必要があります。 (これはすでに解決され)これらはhttp://my.api.call.com/New_url_1_level_1.../New_url1_level_2/に変わるでしょう

{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'...} 

JSONの

例...

の問題は、どのように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')); 
      }); 
      } 

EDIT:現時点では、別のループを開始する前にループごとにそうであるように見えます。したがって、それはループで始まり、別のものが起動されていれば、それが実行される前に実行されません。

メインループ 内部ループ1 内部ループ2 < - これは最初に行うべきではありませんか?

+0

あなたのリンクが機能しません、有効なデータを提供してください – dllhell

答えて

0
  1. あなたの関数recursePxJson()ためのパラメータとして、あなたのloopApiUrl変数を処理します。

  2. 無効なものを取り除くrecursionブール値。


あなたはそれが簡単にjQueryを捨てそして昔ながらのXMLHTTPRequestをを利用することを見つけることがあります。あなたのコードは少し長くなりますしかしあなたはあなたのやっていることのより良いコントロールを得るでしょう。

+0

あなたの提案に感謝しますが、少なくとも私はそれを動作させることができませんでした。そして、私は、より高いレベルのAPIを使用すると、普通のXMLHTTPRequestを使用すると、さらにスパゲッティになります:)どういうわけか、「データ」は常に同じです(jQueryの取得後)。そして、それは新しいget要求をしても、それは最初の応答のデータを使用しています。 – user1271930

関連する問題