Advertisement
  1. Code
  2. PHP

Cómo analizar JSON en PHP

Scroll to top
Read Time: 8 min

Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)

JSON, acrónimo de JavaScript Object Notation, o "notación de objeto de JavaScript", es un formato ligero común para almacenar e intercambiar información. Como su nombre sugiere, inicialmente se derivó de JavaScript, pero es un formato independiente del lenguaje para el almacenamiento de información. Muchos lenguajes como PHP ahora implementan funciones para leer y crear datos JSON.

Este tutorial te enseñará cómo leer un archivo JSON y convertirlo a una matriz en PHP. Aprende cómo analizar JSON usando las funciones json_decode() y json_encode().

Lectura de JSON desde un archivo o cadena en PHP

Supongamos que tienes un archivo que contiene información en formato JSON. ¿Cómo accedes a esa información y cómo la almacenas en PHP?

Primero necesitas obtener los datos del archivo y colocarlos en una variable usando file_get_contents(). Una vez que los datos estén en una cadena, puedes llamar a la función json_decode() para extraer la información. Ten en cuenta que JSON simplemente proporciona una manera de almacenar información como una cadena utilizando un conjunto de reglas predefinidas. Nuestro trabajo es decodificar las cadenas correctamente y obtener la información que queremos.

La función json_decode() acepta cuatro parámetros, pero en la mayoría de las situaciones solamente necesitarás los dos primeros. El primer parámetro especifica la cadena que quieras decodificar. El segundo parámetro determina de qué manera se devuelven los datos decodificados. Establecer su valor en true devolverá una matriz asociativa, mientras que false devolverá objetos. Aquí puedes ver un ejemplo básico. Tenemos un archivo llamado people.json con el siguiente contenido:

1
{
2
    "name": "Monty",
3
    "email": "monty@something.com",
4
    "age": 77
5
}

Podemos leer información de este archivo JSON usando el siguiente código:

1
<?php
2
3
$people_json = file_get_contents('people.json');
4
5
$decoded_json = json_decode($people_json, false);
6
7
echo $decoded_json->name;
8
// Monty

9
10
echo $decoded_json->email;
11
// monty@something.com

12
13
echo $decoded_json->age;
14
// 77

15
16
?>

En el ejemplo anterior, json_decode() devolvió un objeto porque el valor del segundo parámetro se estableció en false. Puedes establecer su valor en true para recuperar los datos como una matriz asociativa.

1
<?php
2
3
$people_json = file_get_contents('people.json');
4
5
$decoded_json = json_decode($people_json, true);
6
7
echo $decoded_json['name'];
8
// Monty

9
10
echo $decoded_json['email'];
11
// monty@something.com

12
13
echo $decoded_json['age'];
14
// 77

15
16
?>

Ahora vamos a decodificar JSON un poco más complicado e intentaremos recuperar información útil de él.

1
{
2
    "name": "Monty",
3
    "email": "monty@something.com",
4
    "age": 77,
5
    "countries": [
6
        {"name": "Spain", "year": 1982},
7
        {"name": "Australia", "year": 1996},
8
        {"name": "Germany", "year": 1987}
9
    ]
10
}

Nuestro objetivo es recuperar todos los países visitados por la persona en diferentes años. El valor devuelto por $decoded_json['countries'] será en realidad una matriz, y la recorreremos como lo haríamos con las matrices regulares para obtener nuestra información.

1
<?php
2
3
$people_json = file_get_contents('people.json');
4
5
$decoded_json = json_decode($people_json, true);
6
7
$name = $decoded_json['name'];
8
$countries = $decoded_json['countries'];
9
10
foreach($countries as $country) {
11
    echo $name.' visited '.$country['name'].' in '.$country['year'].'.';
12
}
13
/*

14
Monty visited Spain in 1982.

15
Monty visited Australia in 1996.

16
Monty visited Germany in 1987.

17
*/
18
19
?>

Revisemos solamente un último ejemplo de extracción de información desde un archivo JSON. Aquí está el JSON desde el que extraeremos nuestros datos.

1
{
2
    "customers": [
3
      {
4
        "name": "Andrew",
5
        "email": "andrew@something.com",
6
        "age": 62,
7
        "countries": [
8
          {
9
            "name": "Italy",
10
            "year": 1983
11
          },
12
          {
13
            "name": "Canada",
14
            "year": 1998
15
          },
16
          {
17
            "name": "Germany",
18
            "year": 2003
19
          }
20
        ]
21
      },
22
      {
23
        "name": "Sajal",
24
        "email": "sajal@something.com",
25
        "age": 65,
26
        "countries": [
27
          {
28
            "name": "Belgium",
29
            "year": 1994
30
          },
31
          {
32
            "name": "Hungary",
33
            "year": 2001
34
          },
35
          {
36
            "name": "Chile",
37
            "year": 2013
38
          }
39
        ]
40
      },
41
      {
42
        "name": "Adam",
43
        "email": "adam@something.com",
44
        "age": 72,
45
        "countries": [
46
          {
47
            "name": "France",
48
            "year": 1988
49
          },
50
          {
51
            "name": "Brazil",
52
            "year": 1998
53
          },
54
          {
55
            "name": "Poland",
56
            "year": 2002
57
          }
58
        ]
59
      },
60
      {
61
        "name": "Monty",
62
        "email": "monty@something.com",
63
        "age": 77,
64
        "countries": [
65
          {
66
            "name": "Spain",
67
            "year": 1982
68
          },
69
          {
70
            "name": "Australia",
71
            "year": 1996
72
          },
73
          {
74
            "name": "Germany",
75
            "year": 1987
76
          }
77
        ]
78
      }
79
    ]
80
}

Esta vez tenemos dos matrices anidadas en los datos JSON. Por lo tanto, utilizaremos dos bucles anidados para obtener los países visitados por diferentes clientes.

1
<?php
2
3
$people_json = file_get_contents('people.json');
4
5
$decoded_json = json_decode($people_json, true);
6
7
$customers = $decoded_json['customers'];
8
9
foreach($customers as $customer) {
10
    $name = $customer['name'];
11
    $countries = $customer['countries'];
12
13
    foreach($countries as $country) {
14
        echo $name.' visited '.$country['name'].' in '.$country['year'].'.';
15
    }
16
}
17
18
/*

19
Andrew visited Italy in 1983.

20
Andrew visited Canada in 1998.

21
Andrew visited Germany in 2003.

22


23
Sajal visited Belgium in 1994.

24
Sajal visited Hungary in 2001.

25
Sajal visited Chile in 2013.

26


27
Adam visited France in 1988.

28
Adam visited Brazil in 1998.

29
Adam visited Poland in 2002.

30


31
Monty visited Spain in 1982.

32
Monty visited Australia in 1996.

33
Monty visited Germany in 1987.

34
*/
35
36
?>

Ahora deberías tener una idea aproximada del enfoque que deberías tomar para leer datos JSON de un archivo dependiendo de cómo se haya creado.

Lectura de datos JSON sin conocer las claves de antemano

Hasta ahora hemos leído datos JSON en casos en los que ya conocíamos todas las claves. Puede que eso no siempre suceda. Afortunadamente, aún podemos extraer información útil del archivo una vez que lo hayamos almacenado como una matriz asociativa. El siguiente ejemplo debería aclarar las cosas.

1
{
2
    "kdsvhe": {
3
        "name": "Andrew",
4
        "age": 62
5
    },
6
    "lvnwfd": {
7
        "name": "Adam",
8
        "age": 65
9
    },
10
    "ewrhbw": {
11
        "name": "Sajal",
12
        "age": 72
13
    },
14
    "klkwcn": {
15
        "name": "Monty",
16
        "age": 77
17
    }
18
}

Las claves en el JSON anterior parecen ser cadenas aleatorias que no podemos predecir de antemano. Sin embargo, una vez que lo convirtamos a una matriz asociativa ya no necesitaremos saber los valores exactos de las claves para recorrer los datos usando bucles.

1
<?php
2
3
$people_json = file_get_contents('people.json');
4
5
$decoded_json = json_decode($people_json, true);
6
7
foreach($decoded_json as $key => $value) {
8
    $name = $decoded_json[$key]["name"];
9
    $age = $decoded_json[$key]["age"];
10
    
11
    echo $name.' is '.$age.' years old.';
12
}
13
14
/*

15
Andrew is 62 years old.

16
Adam is 65 years old.

17
Sajal is 72 years old.

18
Monty is 77 years old.

19
*/
20
21
?>

Creación de datos JSON en PHP

En PHP también puedes convertir tus propios datos en una cadena JSON que tenga el formato correcto con la ayuda de la función json_encode(). Básicamente acepta tres parámetros, pero por lo general solamente necesitarás el primero, es decir, el valor que quieras codificar en la mayoría de las situaciones.

1
<?php
2
3
$people_info = [
4
    "customers" => [
5
        ["name" => "Andrew", "score" => 62.5],
6
        ["name" => "Adam", "score" => 65.0],
7
        ["name" => "Sajal", "score" => 72.2],
8
        ["name" => "Monty", "score" => 57.8]
9
    ]
10
];
11
12
echo json_encode($people_info);
13
14
/*

15
{"customers":[{"name":"Andrew","score":62.5},{"name":"Adam","score":65},{"name":"Sajal","score":72.2},{"name":"Monty","score":57.8}]}

16
*/
17
18
?>

Es posible que también debas usar algunas banderas para obtener la cadena JSON en el formato deseado. Por ejemplo, la bandera JSON_PRETTY_PRINT puede ser usada para añadir espacios en blanco y así dar un formato adecuado a la cadena JSON. De manera similar, puedes usar la bandera JSON_PRESERVE_ZERO_FRACTION para asegurarte de que los valores flotantes siempre se almacenen como tales, incluso si son equivalentes a algún número entero en su magnitud. Puedes ver una lista de todas esas banderas en la documentación oficial.

1
<?php
2
3
$people_info = [
4
    "customers" => [
5
        ["name" => "Andrew", "score" => 62.5],
6
        ["name" => "Adam", "score" => 65.0],
7
        ["name" => "Sajal", "score" => 72.2],
8
        ["name" => "Monty", "score" => 57.8]
9
    ]
10
];
11
12
echo json_encode($people_info, JSON_PRETTY_PRINT|JSON_PRESERVE_ZERO_FRACTION);
13
14
/*

15
{

16
    "customers": [

17
        {

18
            "name": "Andrew",

19
            "score": 62.5

20
        },

21
        {

22
            "name": "Adam",

23
            "score": 65.0

24
        },

25
        {

26
            "name": "Sajal",

27
            "score": 72.2

28
        },

29
        {

30
            "name": "Monty",

31
            "score": 57.8

32
        }

33
    ]

34
}

35
*/
36
37
?>

Manejo de errores durante la codificación y decodificación

El formato JSON requiere que sigamos un conjunto específico de reglas para la adecuada codificación y decodificación de las cadenas. Por ejemplo, los nombres y los valores deben escribirse entre comillas y no debe haber una coma final después de pares nombre-valor. La función json_last_error_msg() puede ayudarte a determinar qué tipo de error estás recibiendo para que puedas tomar las medidas adecuadas. Este es un ejemplo muy básico:

1
<?php
2
3
$sample_json = '{"name": "value", }';
4
5
var_dump(json_decode($sample_json));
6
// NULL

7
8
echo json_last_error_msg();
9
// Syntax error

10
11
?>

Pensamientos finales

En este tutorial aprendiste cómo leer datos JSON desde un archivo o cadena en PHP. También aprendimos cómo convertir ese JSON en una matriz y cómo recorrerlo para extraer la información que queramos. Ahora deberías poder obtener información de JSON en un archivo en el que no conoces todas las claves en pares clave-valor. En las dos últimas secciones, cubrimos el tema de cómo generar cadenas con datos en formato JSON usando PHP, además de los errores que puedes encontrar durante el proceso de codificación y decodificación.

Con suerte, esto responderá todas tus preguntas con respecto a la codificación y decodificación de JSON en PHP.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.