2013-04-02 70 views
8

我有一個jQuery應用可變輸出一個JSON像這樣:轉換ColdFusion的JSON爲結構

[{"id":1}, 
{"id":197,"children":[{"id":198},{"id":199},{"id":200}]}, 
{"id":2,"children":[{"id":3},{"id":4},{"id":143},{"id":6},{"id":5},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12}]}, 
{"id":15,"children":[{"id":17},{"id":190},{"id":191},{"id":131},{"id":16},{"id":142},{"id":124}]}, 
{"id":149,"children":[{"id":150},{"id":160},{"id":161},{"id":184}]}, 
{"id":20,"children":[{"id":132},{"id":127},{"id":152},{"id":107},{"id":108},{"id":109},{"id":110},{"id":125},{"id":128},{"id":130},{"id":129},{"id":112}]}, 
{"id":162,"children":[{"id":163},{"id":164},{"id":165},{"id":166},{"id":186},{"id":187}]}, 
{"id":167,"children":[{"id":173},{"id":168},{"id":170},{"id":169},{"id":192},{"id":194}]}, 
{"id":174,"children":[{"id":176},{"id":175},{"id":188}]}, 
{"id":153,"children":[{"id":178},{"id":179},{"id":195},{"id":154},{"id":157}]}, 
{"id":180,"children":[{"id":181},{"id":182},{"id":183},{"id":189}]}, 
{"id":122}, 
{"id":21}, 
{"id":13}, 
{"id":92}, 
{"id":22}, 
{"id":113}, 
{"id":114}] 

我需要這個變量轉換成一個結構,然後循環由第一id參數的結構,找到子女爲每個id(如果有的話)。我試圖將它轉換爲像這樣的結構,但我得到一個錯誤:

<cfset jsonarray = deserializeJson(output)> 
<cfloop collection="#jsonarray#" index="id"> 
<cfdump var="#jsonarray[id]#"> 
</cfloop> 

它不承認該變量作爲結構:

Invalid collection [{id={1}}, {children={[{id={198}}, {id={199}}, {id={200}}]},id={197}}, {children={[{id={3}}, {id={143}}, {id={4}}, {id={6}}, {id={5}}, {id={7}}, {id={8}}, {id={9}}, {id={10}}, {id={11}}, {id={12}}]},id={2}}, {children={[{id={17}}, {id={190}}, {id={191}}, {id={131}}, {id={16}}, {id={142}}, {id={124}}]},id={15}}, {children={[{id={150}}, {id={160}}, {id={161}}, {id={184}}]},id={149}}, {children={[{id={132}}, {id={127}}, {id={152}}, {id={107}}, {id={108}}, {id={109}}, {id={110}}, {id={125}}, {id={128}}, {id={130}}, {id={129}}, {id={112}}]},id={20}}, {children={[{id={163}}, {id={164}}, {id={165}}, {id={166}}, {id={186}}, {id={187}}]},id={162}}, {children={[{id={173}}, {id={168}}, {id={170}}, {id={169}}, {id={192}}, {id={194}}]},id={167}}, {children={[{id={176}}, {id={175}}, {id={188}}]},id={174}}, {children={[{id={178}}, {id={179}}, {id={195}}, {id={154}}, {id={157}}]},id={153}}, {children={[{id={181}}, {id={182}}, {id={183}}, {id={189}}]},id={180}}, {id={122}}, {id={21}}, {id={13}}, {id={92}}, {id={22}}, {id={113.... Must be a valid structure or COM object. 
+3

@Leigh已經得到了你在正確的軌道上,只要一個通用的解決方案去。另請注意,您將JSON反序列化爲變量'jsonarray',然後將其引用爲'session.jsonarray'。這是兩個不同的變量。 –

+0

錯字,它已被編輯,謝謝 – eduski

回答

12

JSON中,[]表示數組和一個結構(或對象)。所以你的輸入實際上是一個結構數組。您需要使用一個array循環,而不是一個集合循環:

<cfset arrayOfStructs = deserializeJson(output)> 
<cfloop array="#arrayOfStructs#" index="parent"> 
     <cfset parentID = parent.id /> 
     ... 
</cfloop> 

children也是結構的數組。在外部循環內部,檢查是否存在該鍵。如果找到,則循環訪問子數組,並對每個id執行一些操作:

<cfif structKeyExists(parent, "children")> 
     <cfloop array="#parent.children#" index="child"> 
      ... 
     </cfloop> 
    </cfif> 
1

一個整潔的cfscript版本。 :)

<cfscript> 
    structObj = deserializeJson(jsonString); 

    for(i = 1; i LTE ArrayLen(structObj); i++){ 

     WriteOutput("parent id : " & structObj[i].id & "<br>"); 
     if(StructKeyExists(structObj[i], "children")){ 
      for(j = 1; j LTE ArrayLen(structObj[i].children); j++){ 
       WriteOutput(" -children id : " & structObj[i].children[j].id & "<br>"); 
      } 
     } 
    } 
</cfscript> 
1

我創建了一個角1.4的ColdFusion 9 JSON正規化here

var myURL = 'myCfc.cfc?method=getItemsFromDb'; 
var app = angular.module('angularOutput',[]); 
app.controller("sectionController", function($scope, $http) { 
     $http.get(myURL). 
     success(function(data, status, headers, config) { 
      var log = []; 
      var output = ''; 
      angular.forEach(data.DATA, function(value, key) { 
        this.push(output +='{"value": '); 
        this.push(output += '"'+value[0]+'"'); 
        this.push(output +=',"text":'); 
        this.push(output += '"'+value[1]+'"'); 
        this.push(output +='}'); 
        this.push(output +=','); 
       }, log); 
       output = output.replace(/,\s*$/, "");/*had to remove the final comma */ 
       output = '['+output+']'; /*had to add the [] to corectally form the output*/ 

      $scope.sections = angular.fromJson(output); 
     }). 
     error(function(data, status, headers, config) { 
      console.log(data); 
     }); 
    });