2013-04-02 17 views
8

ho un'uscita variabile JSON da un'applicazione jQuery come così:Converti coldfusion JSON a struct

[{"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}] 

ho bisogno di convertire questa variabile per una struct e poi avvolgere lo struct dal primo parametro id per trovare il bambini per ogni id (se ce n'è uno). Ho cercato di convertirlo come una struttura in questo modo, ma sto ottenendo un errore:

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

Esso non riconosce la variabile come una struttura:

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 si è ottenuto sulla strada giusta per quanto riguarda una soluzione generale va. Si noti inoltre che si sta deserializzando il JSON in una variabile 'jsonarray', quindi si fa riferimento a' session.jsonarray'. Quelle sono due diverse variabili. –

+0

typo, è stato modificato, grazie – eduski

risposta

12

Nel JSON, il [] denota una matrice e {} una struttura (o oggetto). Quindi il tuo contributo è in realtà una serie di strutture. È necessario utilizzare un array ciclo, non è un ciclo di raccolta:

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

children è anche una serie di strutture. All'interno del ciclo esterno, controlla l'esistenza di quella chiave. Se trovato, passa attraverso l'array figlio e fai qualcosa con ciascuno degli id:

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

Una versione di cfscript ordinata. :)

<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

ho creato un angolare 1.4 ColdFusion 9 JSON normalizzatore 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); 
     }); 
    });