Jak wygenerować odpowiedź json za pomocą php

W modelu:

public function groups($getGroupId) {
        $cols = array('group_id','name');
        $sql = $this->select ()
                    ->from ( $this->_name, $cols )
                    ->where ( 'parent_id=?', $getGroupId );
        $groupDetails = $this->fetchAll ( $sql );
        //$childGroupName = $groupDetails['name'];
        return $groupDetails;
}

Strona groupDetails.php:

$dbGroup = new dbGroups();
$groupDetails = $dbGroup -> groups($getGroupId);
$jsonResponse = json_encode($groupDetails);
print_r($jsonResponse);

Podczas drukowania danych otrzymuję odpowiedź w ten sposób

[{"group_id":"2","name":"ABCD"},{"group_id":"7","name":"XYZ"}]  

Ale chcę uzyskać takie wyjście, ponieważ muszę wygenerować jstree za pomocą json

[
   {
      "data" : {
         "icon" : <optional>,
         "title" : <node name>
      },
      "attr" : {
         "rel" : <the type you defined in the js (maybe "group")>,
         "title" : <node title>,
         "id" : <the node's id / group id>
      },
      "state" : "closed"
   }
]
1
vvr 27 luty 2012, 13:53

2 odpowiedzi

Najlepsza odpowiedź

Ponieważ używasz Zend Framework, zalecam korzystanie z Zend_Json . Zend_Json jest całkiem użytecznym komponentem do użycia w celu sformatowania Json z dowolnego obsługiwanego formatu (obiekt, tablica, xml...).

Zend_Json::decode() i Zend_Json::encode() pozwolą Ci kodować i dekodować Json, a prettyPrint() służy do ładniejszego wydruku.


Edytuj: Jak powiedział Svish, twoje dwa przykłady nie wyglądają podobnie, więc trudno zgadnąć, co chcesz umieścić w swoim drzewie.

Musisz utworzyć własną tablicę, aby wyglądała tak, jak chcesz.

Na przykład załóżmy, że chcesz mieć tylko jeden wiersz z bazy danych w swoim drzewie, a następnie twoja tablica wyglądałaby mniej więcej tak:

$v = array(
       array(
         "data" => array("icon" => "ICON",
                         "title" => $row->name),
         "attr" => array("rel" => "REL",
                         "title" => "TITLE", 
                         "id" => $row->group_id),
          "state" =>     "closed"));
echo Zend_Json::encode($v);

Te linie powinny przypominać twoje przykłady.

Aby działało z Twoim fetchAll(), proste foreach to zrobi.

1
Liyali 27 luty 2012, 15:50

Zalecam korzystanie z danych wyjściowych z json_encode w takim stanie, w jakim jest. Zajmuje mniejszą przepustowość. Jedynym powodem, dla którego widzę wszystkie białe znaki, jest debugowanie, a do tego wolę używać FireBug i/lub JSONView w FireFox.

W każdym razie, jeśli naprawdę chcesz, możesz spróbować flagi JSON_PRETTY_PRINT? Wygląda na to, że zostało to dodane w 5.4.0, więc może nie obsługuje go wersja, na której jesteś. Wygląda na to, że są tam opcje, których możesz użyć w komentarzach. Może znajdziesz coś przydatnego? http://www.php.net/manual/en/function .json-encode.php#102091


Mówisz, że musisz teraz stworzyć jstree, a to nie ma nic wspólnego z tym, o co prosisz. Oto dwa przykłady danych, które w ogóle nie wyglądają podobnie. json_encode nie robi nic specjalnego ani magicznego. Po prostu pobiera dane i zamienia je w JSON. Twoim zadaniem jest upewnienie się, że dane wyglądają poprawnie, zanim zostaną zakodowane. Twoje zapytanie do bazy danych najprawdopodobniej zwróci zestaw płaskich wierszy i będziesz musiał przejść przez nie w pętli i jakoś wygenerować swoje drzewo tak, jak chcesz. Prawdopodobnie znajdziesz tutaj inne pytania dotyczące tworzenia struktur drzewiastych z płaskich wyników DB.

2
Svish 27 luty 2012, 14:52