ejemplo - Cómo json_encode php array pero las claves sin comillas
php object to json (4)
He creado una clase para formatear json con php sin comillas en las claves aquí es
class JsonFormatter
{
static $result = '''';
static $separator = '''';
public static function iterateArray($data) : string
{
static::$result .= ''['';
static::$separator = '''';
foreach ($data as $key => $val) {
if (is_int($val)) {
} elseif (is_string($val)) {
static::$result .= ''"'' . str_replace(''"'', ''/"'', $val) . ''"'';
} elseif (is_bool($val)) {
static::$result .= $val ? ''true'' : ''false'';
} elseif (is_object($val)) {
static::iterateObject($val);
static::$result .= '', '';
} elseif (is_array($val)) {
static::iterateArray($val);
static::$result .= '', '';
} else {
static::$result .= $val;
}
if (!is_int($val)) {
static::$separator = '', '';
}
}
static::$result .= '']'';
return static::$result;
}
public static function iterate($data)
{
if (is_array($data)) {
static::iterateArray($data);
} elseif (is_object($data)) {
static::iterateObject($data);
}
return static::$result;
}
public static function iterateObject($data)
{
static::$result .= ''{'';
static::$separator = '''';
foreach ($data as $key => $val) {
static::$result .= static::$separator . $key . '':'';
if (is_int($val)) {
static::$result .= $val;
} elseif (is_string($val)) {
static::$result .= ''"'' . str_replace(''"'', ''/"'', $val) . ''"'';
} elseif (is_bool($val)) {
static::$result .= $val ? ''true'' : ''false'';
} elseif (is_object($val)) {
static::iterate($val, true);
static::$result .= '', '';
} elseif (is_array($val)) {
static::iterateArray($val, true);
static::$result .= '', '';
} else {
static::$result .= $val;
}
static::$separator = '', '';
}
static::$result .= ''}'';
return static::$result;
}
}
ahora puedes llamar
$jsonWithoutKeyQuotes = JsonFormatter::iterate($data);
Gracias a Marcin Orlowski.
Estoy tratando de trazar (con Flot ) un gráfico circular con algunos datos
var data = <?php echo json_encode($data)?>
El resultado que obtengo de esto es este:
var data = [
{"label":"Crear Usuario", "data":"2"},
{"label":"Impresoras", "data":"1"},
{"label":"Problema Correo", "data":"1"},
{"label":"Requisicion Equipo", "data":"1"},
{"label":"Sitio Web", "data":"1"}
]
El problema aquí es que necesito la label
y los data
sin las comillas, ya probé json_encode($data, JSON_NUMERIC_CHECK);
pero solo quita las comillas de los numeros.
El siguiente formato es lo que necesito:
var data = [
{label:"Crear Usuario",data:2}, ...
Intenta algo como esto:
function buildBrokenJson( array $data ) {
$result = ''{'';
$separator = '''';
foreach( $data as $key=>$val ) {
$result .= $separator . $key . '':'';
if( is_int( $val ) ) {
$result .= $val;
} elseif( is_string( $val ) ) {
$result .= ''"'' . str_replace( ''"'', ''/"'', $val) . ''"'';
} elseif( is_bool( $val ) ) {
$result .= $val ? ''true'' : ''false'';
} else {
$result .= $val;
}
$separator = '', '';
}
$result .= ''}'';
return $result;
}
y cuando se ejecuta
$a = array("string"=>''Crear "Usuario'', ''foo''=>'':'', "int"=>2, "bool"=>false);
var_dump( buildBrokenJson($a) );
da:
string(54) "{string:"Crear /"Usuario", foo:":", int:2, bool:false}"
No hay diferencia entre las claves entre comillas y no entre comillas. El problema está en la cita en torno a los valores de datos reales, ya que Flot requiere números, no cadenas.
La función json_encode decide si debe cotizar según el tipo de datos que le está dando. En este caso, parece que cualquier operación que esté realizando para crear $ data está produciendo valores de cadena en lugar de números enteros. Debe volver a examinar esas operaciones, o decirle explícitamente a PHP que las interprete como números, usando la conversión (int) o (float), o las funciones intval / floatval.
Primero, tienes que generar tu matriz en PHP para que los valores de los datos sean enteros, no cadenas:
Emulé tu matriz desde tu json_encode (), supongo que se parece a esto (o debería):
$array = array(
array("label" => "Crear Usuario", "data" => 2),
array("label" => "Impresoras", "data" => 1),
array("label" => "Problema Correo", "data" => 1),
array("label" => "Requisicion Equipo", "data" => 1),
array("label" => "Sitio Web", "data" => 1)
);
$data = json_encode($array);
- Tenga en cuenta que los 2 y 1 no tienen comillas, por lo que de esta manera son enteros, esto es importante.
Entonces estás perdiendo Javascript en JSON.parse () para convertir esa salida en un objeto json:
<script>
var data = ''<?php echo $data; ?>'';
var json = JSON.parse(data);
console.log(json);
console.log(json[0]);
</script>
- Tenga en cuenta que var data = ... es SINGLE QUOTED, por lo que puede capturar el eco de php como una cadena
La console.log () ''s esta salida para mí:
[Object, Object, Object, Object, Object] // First console.log(): one object with the 5 Objects.
Object {label: "Crear Usuario", data: 2} // secons console log (json[0]) with the first object
Parece que lo que necesitas, ¿verdad?