/** * @group Core * @group DataTable * @group DataTable_Renderer * @group DataTable_Renderer_JSON */ public function testJSONArrayIsMadeOfArrayTest3() { $dataTable = $this->_getDataTableArray_containsDataTableArray_simpleOneRow(); $render = new Piwik_DataTable_Renderer_Json(); $render->setTable($dataTable); $expected = '{"idSite":{"row1":14,"row2":15,"row3":[]}}'; $rendered = $render->render(); $this->assertEquals($expected, $rendered); }
/** * Render a multidimensional array to Json * Handle Piwik_DataTable|Piwik_DataTable_Array elements in the first dimension only, following case does not work: * array( * array( * Piwik_DataTable, * 2 => array( * 1, * 2 * ), * ), * ); * * @static * @param $array can contain scalar, arrays, Piwik_DataTable and Piwik_DataTable_Array * @param int $level * @return string */ public static function convertMultiDimensionalArrayToJson($array) { // Naive but works for our current use cases $arrayKeys = array_keys($array); $isAssociative = !is_numeric($arrayKeys[0]); if($isAssociative) { $json = "{"; } else { $json = "["; } foreach ($array as $key=>$value) { if($isAssociative) { $json .= "\"".$key."\":"; } switch(true) { // Case dimension is a PHP array case (is_array($value)): $json .= json_encode($value); break; // Case dimension is a Piwik_DataTable_Array or a Piwik_DataTable case ($value instanceof Piwik_DataTable_Array || $value instanceof Piwik_DataTable): $XMLRenderer = new Piwik_DataTable_Renderer_Json(); $XMLRenderer->setTable($value); $renderedReport = $XMLRenderer->render(); $json .= $renderedReport; break; // Case scalar default: $json .= json_encode($value); break; } $json .= ","; } // Remove trailing "," $json = substr ($json, 0, strlen($json) - 1); if($isAssociative) { $json .= "}"; } else { $json .= "]"; } return $json; }