Mostrando entradas con la etiqueta json. Mostrar todas las entradas
Mostrando entradas con la etiqueta json. Mostrar todas las entradas

sábado, 31 de agosto de 2019

JavaScript: objetos JSON

Ya hemos visto en una entrada anterior lo que son los objetos JSON (JavaScript Object Notation) y algunos ejemplos. Está disponible en la siguiente entrada.
En el siguiente caso práctico vamos a manejar el objeto JSON usando únicamente JavaScript, esto es, si usar jQuery y sin usar AJAX.

Versión 1

Disponemos de un objeto JSON definido como variable dentro del código JavaScript. La variable se denomina peliculas y contiene un array con siete películas. Dentro del array cada elemento es un objeto del tipo clave-valor donde se tiene un id de cada película con su nombre, director, año y calificación.

El objetivo es listar el nombre y año de cada una de las siete películas.



HTML

La última línea del body llama al procedimiento JS. Esto se hace en ese punto, para que dé tiempo a que se cargue el DOM.

 <!DOCTYPE html>  
 <html>  
  <head>  
   <meta charset="utf-8">  
   <meta name="viewport" content="width=device-width">  
   <title>Listar un JSON</title>  
   <link href="style.css" rel="stylesheet" type="text/css" />  
  </head>  
  <body>  
   <div></div>  
   <script type="text/javascript" src="script.js"></script>  
  </body>  
 </html>  


JavaScript


 var peliculas=[  
  {  
   "id": 1,  
   "nombre": "El sexto sentido",  
   "director": "M. Night Shyamalan",  
   "year": 1999,  
   "clasificacion": "Drama"  
  },  
  {  
   "id": 2,  
   "nombre": "Pulp Fiction",  
   "director": "Tarantino",  
   "year": 1994,  
   "clasificacion": "Acción"  
  },  
  {  
   "id": 3,  
   "nombre": "Todo Sobre Mi Madre",  
   "director": "Almódovar",  
   "year": 1999,  
   "clasificacion": "Drama"  
  },  
  {  
   "id": 4,  
   "nombre": "300",  
   "director": "Zack Snyder",  
   "year": 2007,  
   "clasificacion": "Acción"  
  },  
  {  
   "id": 5,  
   "nombre": "El silencio de los corderos",  
   "director": "Jonathan Demme",  
   "year": 1991,  
   "clasificacion": "Drama"  
  },  
  {  
   "id": 6,  
   "nombre": "Forrest Gump",  
   "director": "Robert Zemeckis",  
   "year": 1994,  
   "clasificacion": "Comedia"  
  },  
  {  
   "id": 7,  
   "nombre": "La vida es bella",  
   "director": "Roberto Benigni",  
   "year": 1997,  
   "clasificacion": "Comedia dramática"  
  }  
 ];  
 console.log(peliculas[0].nombre);  
 var mensaje="";  
 for(let i in peliculas){  
  mensaje+="<li>"+peliculas[i].nombre+" - "+peliculas[i].year+"</li>";  
 }  
 var midiv=document.querySelector('div');  
 midiv.innerHTML=mensaje;  


Versión 2





HTML


  • En la versión 2 se llama al script en el head.
  • El div lleva un id.


 <!DOCTYPE html>  
 <html>  
  <head>  
   <meta charset="utf-8">  
   <meta name="viewport" content="width=device-width">  
   <title>Listar un JSON</title>  
   <script type="text/javascript" src="script.js"></script>  
  </head>  
  <body>  
   <div id="film"></div>  
  </body>  
 </html>  


JavaScript

Hemos reducido un poco el objeto JSON eliminando el id y la clasificación.
Para conseguir que esté cargado el DOM cuando comienza el código hemos utilizado la siguiente estructura de JavaScript puro.

window.addEventListener('load',function(){
    // código que se ejecuta después de que se cargue el DOM
});

 'use strict'  
 var peliculas=[  
  {  
   "nombre": "El sexto sentido",  
   "director": "M. Night Shyamalan",  
   "year": 1999  
  },  
  {  
   "nombre": "Pulp Fiction",  
   "director": "Tarantino",  
   "year": 1994  
  },  
  {  
   "nombre": "Todo Sobre Mi Madre",  
   "director": "Almódovar",  
   "year": 1999  
  },  
  {  
   "nombre": "300",  
   "director": "Zack Snyder",  
   "year": 2007  
  },  
  {  
   "nombre": "El silencio de los corderos",  
   "director": "Jonathan Demme",  
   "year": 1991  
  },  
  {  
   "nombre": "Forrest Gump",  
   "director": "Robert Zemeckis",  
   "year": 1994  
  },  
  {  
   "nombre": "La vida es bella",  
   "director": "Roberto Benigni",  
   "year": 1997  
  }  
 ];  
 window.addEventListener('load',function(){  
  var midiv=document.querySelector('#film');  
  for(let i in peliculas){  
   var p=document.createElement('p');  
   p.append(peliculas[i].nombre+" - "+peliculas[i].year);  
   midiv.append(p);  
  }  
 });  


Pendiente de estudiar

Realizar un tercer caso donde el objeto JSON se encuentre en un archivo propio con extensión json en nuestra carpeta local.


sábado, 17 de agosto de 2019

Transformaciones JSON con AJAX

Veamos cómo transformar un objeto JSON en una cadena de texto y viceversa utilizando parse y stringify.

Versión 1

Disponemos de un archivo JSON que deseamos consultar cuando el usuario pulse un botón.


Podemos ver este código en el siguiente enlace.

HTML

 <!DOCTYPE html>  
 <html lang="es">  
   <head>  
    <meta charset="UTF-8">  
    <title>Transformaciones con JSON</title>  
    <script type="text/javascript" src="script.js"></script>  
   </head>  
   <body>  
    <ul>  
     <li>Marca: <strong id="marca"></strong></li>  
     <li>Modelos: <i id="modelo"></i></li>  
    </ul>  
    <p>  
     <input type="button" value="Consultar" onclick="loadJSONdoc()"/>  
    </p>  
    <p id="mio"></p>  
   </body>  
 </html>  

JavaScript

JSON.parse() toma una cadena JSON y la transforma en un objeto JavaScript. JSON.stringify() toma un objeto JavaScript y lo transforma en una cadena JSON.

 function loadJSONdoc() {  
  var jsonhttp = new XMLHttpRequest();  
  jsonhttp.onreadystatechange = function () {  
   if (jsonhttp.readyState === 4 && jsonhttp.status === 200) {  
    var ObjJSON = JSON.parse(jsonhttp.responseText);  
    var StringifyJSON = JSON.stringify(ObjJSON);  
    document.getElementById("mio").innerHTML="JSON como cadena:<br>" + StringifyJSON;  
    document.getElementById("marca").innerHTML = ObjJSON.empresa;  
    document.getElementById("modelo").innerHTML = ObjJSON.gama.toString();  
   }  
  };  
  jsonhttp.open("GET", "ejemploJSON.json", true);  
  jsonhttp.send();  
 }  

ejemploJSON.json

 {  
  "empresa": "Intel",  
  "gama": ["i3", "i5", "i7", "i9"]  
 }  

Versión 2

En esta ocasión el fichero JSON es un array que contiene dos objetos uno para Intel y otro para AMD. El usuario puede elegir con un desplegable la marca sobre la que desea hacer la consulta.


Algunas referencias útiles en w3schools.
El caso en vivo:

HTML

En este caso hemos añadido el desplegable con tres opciones. La primera de ellas está vacía y oculta para que no se sea por defecto a Intel por defecto.

 <!DOCTYPE html>  
 <html lang="es">  
   <head>  
    <meta charset="UTF-8">  
    <title>Transformaciones con JSON</title>  
    <script type="text/javascript" src="script.js"></script>  
   </head>  
   <body>  
    <ul>  
     <li>Marca: <strong id="marca"></strong></li>  
     <li>Modelos: <i id="modelo"></i></li>  
    </ul>  
    <form>  
     <label for="corporacion">Indique la marca: </label>   
     <select id="myDropdown" name="corporacion">  
      <option hidden disabled selected></option>  
      <option value="intel">Intel</option>   
      <option value="amd">AMD</option>   
     </select>   
     <p>  
      <input type="button" value="Consultar" onclick="loadJSONdoc()"/>  
     </p>  
    </form>  
    <p id="mio"></p>  
   </body>  
 </html>  

JavaScript

Capturamos n que es el valor del desplegable y lo utilizamos para el índice con el que vamos a consultar el array del archivo JSON.

 function loadJSONdoc() {  
  var jsonhttp = new XMLHttpRequest();  
  jsonhttp.onreadystatechange = function () {  
   if (jsonhttp.readyState === 4 && jsonhttp.status === 200) {  
    var ObjJSON = JSON.parse(jsonhttp.responseText);  
    var StringifyJSON = JSON.stringify(ObjJSON);  
    document.getElementById("mio").innerHTML="JSON como cadena:<br>" + StringifyJSON;  
    var n=document.getElementById("myDropdown").selectedIndex;  
    elige(n); //si n=1 se ha elegido Intel, si n=2 AMD  
     function elige(n){  
      document.getElementById("marca").innerHTML = ObjJSON[n-1].empresa;  
      document.getElementById("modelo").innerHTML = ObjJSON[n-1].gama.toString();  
     }  
   }  
  };  
  jsonhttp.open("GET", "ejemploJSON.json", true);  
  jsonhttp.send();  
 }  

ejemploJSON.json

Vemos un corchete [] que contiene dos llaves separadas por una coma {},{}. Este es un objeto JSON válido que se puede verificar en la siguiente página.

 [   
   {   
    "empresa":"Intel",  
    "gama":[   
      "i3",  
      "i5",  
      "i7",  
      "i9"  
    ]  
   },  
   {   
    "empresa":"AMD",  
    "gama":[   
      "Ryzen3",  
      "Ryzen5",  
      "Ryzen7",  
      "Threadripper"  
    ]  
   }  
 ]  

viernes, 16 de agosto de 2019

AJAX sobre un archivo JSON

Disponemos de un archivo JSON muy sencillo:
{"name": "Fer", "country": "Spain"}

El objetivo es conseguir que la información del archivo JSON se mustren en la página web después de que el usuario pulse sobre un botón.

Versión 1




El ejemplo puede verse funcionando en el sigueinte enlace.

HTML

 <!DOCTYPE html>  
 <html>  
  <head>  
   <meta charset="utf-8">  
   <title>Petición AJAX a un JSON</title>  
   <script type="text/javascript" src="script.js"></script>  
  </head>  
  <body>  
   <h1>Formulario</h1>  
   <form>  
    <p>  
     <label for="misDatos">Datos: </label>  
     <input id="mitexto" type="text" name="misDatos"   
     placeholder="Pulse el botón para ver la información" size="33" disabled>  
    <br>  
    <p>  
     <button type="button" onclick="loadJSONdoc()">Obtener</button>  
    </p>  
   </form>  
  </body>  
 </html>  

JavaScript

 function loadJSONdoc(){  
  var req;  
  if (window.XMLHttpRequest){ //para IE7+, Firefox, Chrome, Opera, Safari  
   req=new XMLHttpRequest();  
  }else{ //para IE6, IE5  
   req=new ActiveXObject("Microsoft.XMLHTTP");  
  }  
  req.onreadystatechange = function() {  
   if (req.readyState === 4 && req.status === 200) {  
    var mijson = JSON.parse(req.responseText);  
    var respuesta=mijson.name+" es de "+mijson.country;  
    document.getElementById("mitexto").value = respuesta;  
   }  
  };  
  req.open("GET", "ejemploJSON.json", true);  
  req.send()  
 }  

ejemploJSON.json

 {  
  "name": "Fer",  
  "country": "Spain"  
 }  

Versión 2

Ahora el archivo JSON es un poco más complejo y nos veremos obligados a manejar índices poniendo mijson.cars[1].
El ejemplo puede verse funcionando en el sigueinte enlace.

HTML

No ha cambiado.

JavaScript

 function loadJSONdoc(){  
  var req=new XMLHttpRequest();  
  req.onreadystatechange = function() {  
   if (req.readyState === 4 && req.status === 200) {  
    var mijson = JSON.parse(req.responseText);  
    var respuesta=mijson.name+" tiene "+mijson.cars[1];  
    document.getElementById("mitexto").value = respuesta;  
   }  
  };  
  req.open("GET", "ejemploJSON.json", true);  
  req.send()  
 }  

ejemploJSON.json

 {   
 "name":"John",   
 "age":30,   
 "cars":[ "Ford", "BMW", "Fiat", "WV" ]   
 }  

Versión 3

En esta ocasión el fichero JSON es aún más complejo y necesitaremos bucear un poco más usándo índices y entrando en arrays. Así, mijson.cars[2].models[1].

HTML

No ha cambiado.

JavaScript

 function loadJSONdoc(){  
  var req;  
  var req=new XMLHttpRequest();  
  req.onreadystatechange = function() {  
   if (req.readyState === 4 && req.status === 200) {  
    var mijson = JSON.parse(req.responseText);  
    var respuesta=mijson.name+" tiene "+mijson.cars[2].models[1];  
    document.getElementById("mitexto").value = respuesta;  
   }  
  };  
  req.open("GET", "ejemploJSON.json", true);  
  req.send()  
 }  

ejemploJSON.json

 {  
 "name":"John",  
 "age":30,  
 "cars": [  
  { "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },  
  { "name":"BMW", "models":[ "320", "X3", "X5" ] },  
  { "name":"Fiat", "models":[ "500", "Panda" ] }  
 ]  
 }  

lunes, 12 de agosto de 2019

Estructura de un archivo JSON

Los archivos JSON tienen una estructura especial en forma de arbol. Son similares a los archivos XLM aunque cada uno de ellos con su propias peculiaridades.

Un archivo JSON puede ser utilizado por parte de diferentes programas, no es exclusivo para uso de JavaScript o de AJAX.

Disponemos de varias páginas que nos ayudan a validar y detectar errores.
Los archivos JSON habitualemnte comienzan y finalizan por llaves {} pero también son válidos los que usan corchetes [].

Ejemplo 1

 {  
 "name":"John",  
 "age":30,  
 "cars":[ "Ford", "BMW", "Fiat" ]  
 }  

Ejemplo 2

 {  
  "name":"John",  
  "age":30,  
  "cars": [  
   { "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },  
   { "name":"BMW", "models":[ "320", "X3", "X5" ] },  
   { "name":"Fiat", "models":[ "500", "Panda" ] }  
  ]  
  }  

Ejemplo 3

 {  
  "firstName": "John",  
  "lastName": "Smith",  
  "isAlive": true,  
  "age": 27,  
  "address": {  
   "streetAddress": "21 2nd Street",  
   "city": "New York",  
   "state": "NY",  
   "postalCode": "10021-3100"  
  },  
  "phoneNumbers": [  
   {  
    "type": "home",  
    "number": "212 555-1234"  
   },  
   {  
    "type": "office",  
    "number": "646 555-4567"  
   },  
   {  
    "type": "mobile",  
    "number": "123 456-7890"  
   }  
  ],  
  "children": [],  
  "spouse": null  
 }  

Ejemplo 4

 {"widget": {  
   "debug": "on",  
   "window": {  
     "title": "Sample Konfabulator Widget",  
     "name": "main_window",  
     "width": 500,  
     "height": 500  
   },  
   "image": {   
     "src": "Images/Sun.png",  
     "name": "sun1",  
     "hOffset": 250,  
     "vOffset": 250,  
     "alignment": "center"  
   },  
   "text": {  
     "data": "Click Here",  
     "size": 36,  
     "style": "bold",  
     "name": "text1",  
     "hOffset": 250,  
     "vOffset": 100,  
     "alignment": "center",  
     "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"  
   }  
 }}  

Ejemplo 5

Este es un documento JSON perfectamente válido y no está contenido entre llaves { } sino entre corchetes [ ]. Se trata de un documento de tipo array y para acceder a los elementos se ha de hacer uso de los índices, por ejemplo [0]["powers"][0].

 [  
  {  
   "name": "Molecule Man",  
   "age": 29,  
   "secretIdentity": "Dan Jukes",  
   "powers": [  
    "Radiation resistance",  
    "Turning tiny",  
    "Radiation blast"  
   ]  
  },  
  {  
   "name": "Madame Uppercut",  
   "age": 39,  
   "secretIdentity": "Jane Wilson",  
   "powers": [  
    "Million tonne punch",  
    "Damage resistance",  
    "Superhuman reflexes"  
   ]  
  }  
 ]  

Ejemplo 6

 {   
   "PhoneBook":{   
    "objectid":"pb001",  
    "owner":"pedro@mail.com",  
    "contacts":[   
      {   
       "objectid":"pedro@mail.com",  
       "phone":"612312300",  
       "name":"Peter",  
       "title":"D.",  
       "age":24,  
       "address":[   
         {   
          "objectid":"d000",  
          "street":"5th avenue",  
          "city":"New York City",  
          "state":"New York"  
         },  
         {   
          "objectid":"d001",  
          "street":"Gran Via",  
          "city":"Las Rozas",  
          "state":"Madrid"  
         }  
       ]  
      },  
      {   
       "objectid":"jose@mail.com",  
       "phone":"612312302",  
       "name":"José",  
       "title":"PhDr.",  
       "age":52,  
       "address":[   
         {   
          "objectid":"d002",  
          "street":"Plaza España",  
          "city":"Majadahonda",  
          "state":"Madrid"  
         }  
       ]  
      },  
      {   
       "objectid":"maria@mail.com",  
       "phone":"612312301",  
       "name":"María",  
       "title":"Sra.",  
       "age":21,  
       "address":[   
         {   
          "objectid":"d001",  
          "street":"Gran Via",  
          "city":"Las Rozas",  
          "state":"Madrid"  
         }  
       ]  
      }  
    ]  
   }  
 }