Professional Documents
Culture Documents
Clase 4
Clase 4
{
"artists" : [
{
"artistname" : "Deep Purple",
"albums" : [
{
"albumname" : "Machine Head",
"year" : "1972",
"genre" : "Rock"
},
{
"albumname" : "Stormbringer",
"year" : "1974",
"genre" : "Rock"
}
]
}
]
}
Objetos JSON
Un objeto JSON es un conjunto desordenado de pares nombre/valor,
encerrado entre llaves ({}).
En el siguiente ejemplo, artistname es el nombre y Deep Purple su valor.
{ }
{
"artistname" : "Pink Floyd",
"formed" : "1964"
}
{
"artistname" : "Pink Floyd",
"formed" : "1964",
"origin" : "Cambridge, United Kingdom"
}
Arrays JSON
Un array JSON es una colección ordenada de valores. Permite construir
listas de valores.
{
"artists" : [
{ "artistname" : "Pink Floyd", "formed" : "1964" },
{ "artistname" : "Bruce Springsteen", "born" : "1949" },
{ "artistname" : "U2", "formed" : "1976" }
]
}
O también:
{
"artists" : [
{
"artistname" : "Pink Floyd",
"formed" : "1964"
},
{
"artistname" : "Bruce Springsteen",
"born" : "1949"
},
{
"artistname" : "U2",
"formed" : "1976"
}
]
}
Datos anidados
La mayoría de los ficheros JSON contienen muchos datos anidados. Esto
depende de la estructura de los datos.
{
"artists" : [
{
"artistname" : "Pink Floyd",
"formed" : "1964",
"albums" : [
{
"albumname" : "The Dark Side of the Moon",
"year" : "1973",
"genre" : "Rock"
},
{
"albumname" : "Wish You Were Here",
"year" : "1975",
"genre" : "Rock"
}
]
}
]
}
{
"artists" : [
{
"artistname" : "Pink Floyd",
"formed" : "1964",
"albums" : [
{
"albumname" : "The Dark Side of the Moon",
"year" : "1973",
"genre" : "Rock"
},
{
"albumname" : "Wish You Were Here",
"year" : "1975",
"genre" : "Rock"
}
]
},
{
"artistname" : "Bruce Springsteen",
"born" : "1949",
"albums" : [
{
"albumname" : "Born to Run",
"year" : "1975",
"genre" : "Folk Rock"
},
{
"albumname" : "Born in the U.S.A",
"year" : "1984",
"genre" : "Folk Rock"
},
{
"albumname" : "Human Touch",
"year" : "1992",
"genre" : "Rock and Roll"
}
]
},
{
"artistname" : "U2",
"formed" : "1976",
"albums" : [
{
"albumname" : "The Joshua Tree",
"year" : "1987",
"genre" : "Pop rock"
},
{
"albumname" : "Achtung Baby",
"year" : "1991",
"genre" : "Rock"
}
]
}
]
}
Ejemplo de Uso de JSON: Modelo
de Usuario de SocNet
Ahora vamos a ver cómo se puede utilizar JSON para recordar los datos
relevantes de un usuario.
Los tres primeros valores serán strings. La lista de amigos será un array,
donde cada elemento será el identificador de un amigo (utilizaremos el
correo electrónico como identificación única en el sistema). Finalmente, la
lista de mensajes será otro array donde cada elemento será a su vez un
array (es decir, serán array anidados). Cada array interno contendrá el
instante de publicación del mensaje (timestamp, un número real) y el texto
del mensaje (una cadena).
Por este motivo, las funciones para leer y escribir ficheros JSON son muy
sencillas de utilizar. En ambos casos recurrimos a la biblioteca JSON, así
que lo primero que debemos hacer es:
import json
Lectura
La función para leer un fichero JSON es json.load. Como parámetro un
fichero, así que una forma normal de usarla es:
import json
Escritura
Volcar una estructura Python a un fichero JSON es igual de sencillo.
Supongamos que tenemos la siguiente inicialización de la variable datos:
datos = {
"user_name": "James",
"password": “007”,
"messages": [(1532648502.113984, “mensaje 1”), (1532648642.729385, “mensaje
1”)],
"email": session['email'],
"friends": session['friends']
}
Entonces guardar los datos en el fichero correspondiente sería:
Implementación de Sesiones
Ya hemos dicho en varias oportunidades que el protocolo HTTP no tiene
estado, que no recuerda. ¿Qué significa eso en la práctica? Que
necesitamos información adicional para implementar una “conversación” entre
cliente y servidor. Esta idea de conversación, donde ambas partes
recuerdan lo que han hablado hasta el momento, se llama sesión.
La primera vez que un cliente realiza una petición, después de un tiempo sin
interactuar, el servidor abre una sesión. Las subsecuentes peticiones
desde ese cliente se consideran dentro de la misma sesión. Si pasa mucho
tiempo sin que el cliente realice una petición, el servidor asume que ya no
está conectado y termina la sesión.
Campos ocultos: en los formularios que el servidor envía a cliente para que
sean completados, incluyo un campo del tipo input que no se muestra al
usuario; ese campo lleva información que cuando los datos del formulario
se envíen de vuelta al servidor le servirá para identificar al cliente.
app.secret_key = 'esto-es-una-clave-muy-secreta'
Ahora ya sabes para qué sirve. Si quieres tener más información de este
problema de seguridad informática y su solución, puedes leer aquí.
(1) @app.route('/procesarNombre',methods=['POST'])
(2) def procesa_nombre():
(3) nombre = request.form['nombre']
(4) apellido = request.form['apellido']
(5) session['nombre'] = nombre
(6) session['apellido'] = apellido
(7) return 'Hola ' + nombre + ' ' + apellido
En este ejemplo, en las líneas 3 y 4 se toman los datos provenientes del
formulario, y se almacenan en las variables nombre y apellido,
respectivamente. En las líneas 5 y 6 esos datos se guardan en la sesión; es decir,
estarán disponibles en futuras peticiones del mismo usuario.
(1) @app.route('/saludo',methods=['GET'])
(2) def saludo():
(3) fecha_nacimiento = request.form['nacimiento']
(4) nacim = datetime.strptime(fecha_nacimiento, "%Y-%m-%d")
(5) dias = (datetime.now – f_formato).days
(6) if 'nombre' in session:
(7) nom = session['nombre']
(8) else:
(9) nom = ''
(10)
(11) if 'apellido' in session:
(12) apell = session['apellido']
(13) else:
(14) apell = ''
(15)
(16) return 'Hola: ' + nom + ' ' + apell + ', tienes ' + dias + 'días de vida.'
def save_current_user():
datos = {
"user_name": session["user_name"],
"password": session['password'],
"messages": session['messages'], # lista de tuplas (time_stamp, mensaje)
"email": session['email'],
"friends": session['friends']
}
file_path = os.path.join(SITE_ROOT, "data/", session['email'])
with open(file_path, 'w') as f:
json.dump(datos, f)