2013-04-02 29 views
8

Mam zmienną wyjście JSON z aplikacji jQuery jako tak:Konwersja ColdFusion json do 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}] 

muszę konwertować tej zmiennej struct a następnie pętla strukturę, przez pierwszy id parametru, aby znaleźć dzieci dla każdego id (jeśli taki istnieje). Próbowałem przekonwertować go jako struktury jak tak ale ja dostaję błąd:

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

nie rozpoznaje zmienną jako struktura:

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 nie dostałeś na dobrej drodze jeśli chodzi o ogólne rozwiązanie idzie. Zauważ również, że zmieniasz deseresję JSON na zmienną 'jsonarray', a następnie odwołujesz się do niej jako' session.jsonarray'. To są dwie różne zmienne. –

+0

literówka, została edytowana, dziękuję – eduski

Odpowiedz

12

W JSON The [] oznacza tablicę i {} struktura (lub obiekt). Tak więc twój wkład to w rzeczywistości szereg struktur. Trzeba użyć pętli array, nie pętla kolekcja:

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

children jest tablicą struktur. Wewnątrz pętli zewnętrznej sprawdź, czy istnieje klucz. Jeśli zostanie znaleziony, przeprowadź pętlę w tablicy podrzędnej i zrób coś z każdym z identyfikatorów:

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

Poprawna wersja programu 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

stworzyłem kątowym 1,4 ColdFusion 9 JSON Normalizer 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); 
     }); 
    });