domingo, 5 de febrero de 2017

JSON con python (parte I)


·        JSON (JavaScript Object Notation):

Es un formato para el intercambio de información entre aplicaciones, a pesar de que en sus inicios fue considerado como parte de JavaScript,  es reconocido por una gran variedad de lenguajes de programación (incluido python) ya que es independiente al lenguaje que utilicemos.


Actualmente es empleado para el intercambio de información entre servicios web y APIs y es uno de los formatos alternativos al XML más utilizado por los desarrolladores. Entre los módulos propios de python contamos con el modulo: json, utilizado para trabajar con este formato.


·        Objeto JSON: 

Puede definirse como una entidad que posee propiedades, las cuales pueden ser definidas por nosotros según los datos que necesitemos representar, en el caso de quienes utilizamos el lenguaje python podemos comparar la estructura de un objeto json, con la estructura de un formulario python.


·        Sintaxis objeto JSON:

{“propiedad1” : ”valor1” , ”propiedad2” : ”valor2” , ”propiedad n” : ”valor n”}

Donde la propiedad es una especie de llave a través de la cual podemos acceder a su valor asociado.


·        Valores permitidos por el objeto JSON:

o   Para la propiedad: debe utilizarse una cadena de caracteres, la cual debe colocarse entre comillas dobles.

o   Para los valores podemos usar los siguientes tipos de datos:

§   Números (enteros o float).
§   Un string entre comillas dobles.
§  Un arreglo.
§  Un objeto JSON (entre llaves).


·        Ejemplo básico:

Supongamos que necesitamos crear un objeto para representar un automóvil, para el cual debemos reflejar; marca, modelo y primer 
año que  estuvo disponible en el  mercado, nos quedaría el siguiente objeto JSON:


auto {"marca":"toyota","modelo":"celica","iniciop":"1970"}.

  • Ejemplo práctico:


     Un objeto json, puede contener en su interior otros objetos json, como      veremos en el siguiente ejemplo en el cual simularemos la recepción de  información en formato json, la cual extraeremos del archivo llamado  prueba.json.

 Para los datos que recibiremos, se plantea representar automóviles, los cuales deben agruparse según su marca y a su vez  necesitamos saber el modelo   y el  año en el que inicio la producción de cada auto, la estructura básica de  la información y los datos que utilizaremos se muestran a continuación:

Autos:

Toyota:

1.      Modelo: toyota 4runner, Primer año: 1984.
2.      Modelo: toyota corolla, Primer año: 1971.
3.     Modelo: toyota celica, Primer año: 1970.

              Chevrolet:
1.     Modelo: chevrolet camaro, Primer año: 1967.
2.     Modelo: chevrolet chevelle, Primer año: 1964.
3.     Modelo: chevrolet corvette c4, Primer año: 1984. 
              Ford:
1.     Modelo: ford mustang, Primer año: 1964.
2.     Modelo: ford shelby gr-1, Primer año: 2005.
3.     Modelo: ford T, Primer año: 1908.



El objeto JSON que representa los datos anteriores se muestra a continuación: 


{"autos":
 [
  {"toyota":
     [
      {"modelo":"toyota 4runner","iniciop":"1984"},
      {"modelo":"toyota corolla","iniciop":"1971"},
      {"modelo":"toyota celica","iniciop":"1970"}
     ]
  },
  {"chevrolet":
     [
      {"modelo":"chevrolet camaro","iniciop":"1967"},
      {"modelo":"chevrolet chevelle","iniciop":"1964"},
      {"modelo":"chevrolet corvette C4","iniciop":"1984"}
     ]
  },
  {"ford":
     [
      {"modelo":"ford mustang","iniciop":"1964"},
      {"modelo":"ford shelby gr-1","iniciop":"2005"},
      {"modelo":"ford t","iniciop":"1908"}
     ]
  }
 ]
}



  • Cargar datos de archivo .json usando python:

     
Como indique anteriormente, python cuenta con el modulo: json,  el cual nos  ofrece métodos para trabajar con el formato JSON,a continuación procedo a obtener los datos del archivo: prueba.json para lo cual podemos usar cualquiera de los siguientes métodos:


o   json.load(): recibe como parámetro un archivo que contiene objetos json, y devuelve un diccionario python , con las propiedades y valores indicadas en el objeto  json.

   import json

datos=json.load(open('prueba.json','r'))
print type(datos)


   <type 'dict'>


o   json.loads(): recibe como parametro una cadena de caracteres que contiene un objeto json y devuelve un diccionario python , con las propiedades indicadas en el objeto json.    


   import json

datos=open('prueba.json','r').read()
print type(datos)
datos=json.loads(datos)
print type(datos)


   <type 'str'>
  <type 'dict'>

·        Acceder a elementos de un objeto json:
          Una  vez cargado nuestro objeto json, podemos acceder a sus elementos, solo tenemos que tener claro su estructura, en el caso de nuestro archivo : prueba.json , está formado por un objeto json de clave: "autos" y cuyos valores , son 3 objetos json cuyas claves son : "toyota", "chevrolet" y "ford", a su vez cada una de las marcas está formada por 3 objetos json que contienen la información de los automóviles. A continuación muestro una representación gráfica del objeto json: "autos":
    Supongamos que deseamos obtener los datos del auto: toyota 4runner, lo hacemos con el siguiente código:



  import json

datos=open('prueba.json','r').read()
datos=json.loads(datos)
print datos["autos"][0]["toyota"][0]


  {u'iniciop':u'1984',u'modelo':u'toyota 4runner'}



    Si queremos imprimir los datos de todos los autos de una marca  específica, podemos hacerlo de la siguiente manera:

  import json


llave_marca="toyota"
indice_marca=0

datos=open('prueba.json','r').read()
datosjson.loads(datos)

for auto in datos["autos"][indice_marca][llave_marca]:
 print"############################################"
 print"Modelo: ",auto["modelo"]
 print"Inicio produccion en:" ,auto["iniciop"]
 print"\n"


######################################
Modelo : toyota 4runner
Inicio produccion en : 1984
 
###################################### 
Modelo : toyota corolla
Inicio produccion en : 1971

######################################
Modelo : toyota celica
Inicio produccion en : 1970      

    
    Si queremos imprimir los datos de todo el objeto: "autos" una posible solución es la siguiente:


  import json


datos=open('prueba.json','r').read()

datos=json.loads(datos);

for indice_marca in datos["autos"]:
 for marca in indice_marca.keys():
  for auto in indice_marca[marca]:
   print"######################################"
   print "Modelo: ",auto["modelo"]
   print "Inicio produccion: ",auto["iniciop"]
   print"\n"


######################################
Modelo : toyota 4runner
Inicio produccion en : 1984
 
###################################### 
Modelo : toyota corolla
Inicio produccion en : 1971

######################################
Modelo : toyota celica
Inicio produccion en : 1970 

######################################
Modelo : chevrolet camaro
Inicio produccion en : 1967 

######################################
Modelo : chevrolet chevelle
Inicio produccion en : 1964

######################################
Modelo : chevrolet corvette C4 
Inicio produccion en : 1984

######################################
Modelo : ford mustang 
Inicio produccion en : 1964

######################################
Modelo : ford shelby gr-1 
Inicio produccion en : 2005

######################################
Modelo : ford t 
Inicio produccion en : 1908     


     Referencias: