json_decode

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL json >= 1.2.0)

json_decodeDecodifica una cadena JSON

Descripción

json_decode(
    string $json,
    ?bool $associative = null,
    int $depth = 512,
    int $flags = 0
): mixed

Recupera una cadena codificada en JSON y la convierte en un valor de PHP.

Parámetros

json

La chaîne de caractères json a decodificar.

Esta función solo funciona con cadenas codificadas en UTF-8.

Nota:

PHP implementa un superconjunto de JSON tal como se especifica en la » RFC 7159 original.

associative

Cuando este parámetro vale true, los objetos JSON serán devueltos como arrays asociativos; cuando este parámetro vale false, los objetos JSON serán devueltos como objetos. Cuando este parámetro vale null, los objetos JSON serán devueltos como arrays asociativos o como objetos, según si la constante JSON_OBJECT_AS_ARRAY ha sido definida en el parámetro flags.

depth

Profundidad máxima de anidamiento de la estructura en proceso de decodificación. El valor debe ser superior a 0, e inferior o igual a 2147483647.

flags

Máscara de bits compuesta por JSON_BIGINT_AS_STRING, JSON_INVALID_UTF8_IGNORE, JSON_INVALID_UTF8_SUBSTITUTE, JSON_OBJECT_AS_ARRAY, JSON_THROW_ON_ERROR. El comportamiento de estas constantes se describe en la página de las constantes JSON.

Valores devueltos

Devuelve el valor codificado en el parámetro json en el tipo PHP apropiado. Los valores sin comillas true, false y null son devueltos respectivamente como true, false y null. null es devuelto si el parámetro json no ha podido ser decodificado o si los datos codificados son más profundos que el límite de anidamiento proporcionado.

Errores/Excepciones

Si depth está fuera del rango permitido, una ValueError es lanzada a partir de PHP 8.0.0, mientras que anteriormente se generaba un error de nivel E_WARNING.

Historial de cambios

Versión Descripción
7.3.0 El flags JSON_THROW_ON_ERROR ha sido añadido.
7.2.0 El parámetro associative ahora es nullable.
7.2.0 Los flags JSON_INVALID_UTF8_IGNORE, y JSON_INVALID_UTF8_SUBSTITUTE han sido añadidos.
7.1.0 Una clave JSON vacía ("") puede ser codificada en la propiedad de objeto vacía en lugar de usar una clave con el valor _empty_.

Ejemplos

Ejemplo #1 Ejemplo con json_decode()

<?php
$json
= '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

?>

El resultado del ejemplo sería:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

Ejemplo #2 Acceso a propiedades de objeto inválidas

Acceder a elementos de un objeto que contienen caracteres no permitidos por la convención de nombres de PHP (es decir, el guión) puede realizarse encapsulando el nombre del elemento con corchetes y comillas.

<?php

$json
= '{"foo-bar": 12345}';

$obj = json_decode($json);
print
$obj->{'foo-bar'}; // 12345

?>

Ejemplo #3 Errores comunes al usar la función json_decode()

<?php

// Las siguientes cadenas son válidas en JavaScript pero no en JSON

// El nombre y el valor deben estar rodeados de comillas dobles.
// Las comillas simples no son válidas.
$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null

// El nombre debe estar rodeado de comillas dobles.
$bad_json = '{ bar: "baz" }';
json_decode($bad_json); // null

// La coma final no está permitida.
$bad_json = '{ bar: "baz", }';
json_decode($bad_json); // null

?>

Ejemplo #4 Errores con el parámetro depth

<?php
// Codificación de datos con un nivel máximo de anidamiento de 4 (array -> array -> array -> string)
$json = json_encode(
array(
1 => array(
'English' => array(
'One',
'January'
),
'French' => array(
'Une',
'Janvier'
)
)
)
);

// Definición de errores
$constants = get_defined_constants(true);
$json_errors = array();
foreach (
$constants["json"] as $name => $value) {
if (!
strncmp($name, "JSON_ERROR_", 11)) {
$json_errors[$value] = $name;
}
}

$json = json_encode(
array(
1 => array(
'English' => array(
'One',
'January'
),
'French' => array(
'Une',
'Janvier'
)
)
)
);

// Mostrar errores para diferentes niveles de anidamiento.
var_dump(json_decode($json, true, 4));
echo
'Last error: ', json_last_error_msg(), PHP_EOL, PHP_EOL;

var_dump(json_decode($json, true, 3));
echo
'Last error: ', json_last_error_msg(), PHP_EOL, PHP_EOL;
?>

El resultado del ejemplo sería:

array(1) {
  [1]=>
  array(2) {
    ["English"]=>
    array(2) {
      [0]=>
      string(3) "One"
      [1]=>
      string(7) "January"
    }
    ["French"]=>
    array(2) {
      [0]=>
      string(3) "Une"
      [1]=>
      string(7) "Janvier"
    }
  }
}
Last error: No error

NULL
Last error: Maximum stack depth exceeded

Ejemplo #5 Ejemplo con json_decode() y grandes enteros

<?php
$json
= '{"number": 12345678901234567890}';

var_dump(json_decode($json));
var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));

?>

El resultado del ejemplo sería:

object(stdClass)#1 (1) {
  ["number"]=>
  float(1.2345678901235E+19)
}
object(stdClass)#1 (1) {
  ["number"]=>
  string(20) "12345678901234567890"
}

Notas

Nota:

La especificación JSON no forma parte de Javascript sino de un subproyecto de Javascript.

Nota:

Si ocurre un error durante la decodificación, la función json_last_error() (o json_last_error_msg() con PHP5.5+) podrá ser utilizada para determinar la naturaleza exacta del error.

Ver también

  • json_encode() - Retorna la representación JSON de un valor
  • json_last_error() - Devuelve el último error JSON
  • json_last_error_msg() - Devuelve el mensaje del último error ocurrido durante la llamada a la función json_validate(), json_encode() o json_decode()