JSON
Qué és JSON?
JSON (JavaScript Object Notation) és un format lleuger per a l'intercanvi de dades. Malgrat que es deriva de la sintaxi d'objectes JavaScript, és independent del llenguatge i àmpliament suportat per totes les tecnologies modernes.
S'usa principalment per: - API REST (intercanvi de dades entre client i servidor) - Fitxers de configuració (package.json, tsconfig.json, mkdocs.yml) - Emmagatzematge de dades semiestructurades (MongoDB, Firestore) - Missatgeria (Kafka, AMQP)
Sintaxi JSON
Tipus de dades
{
"cadena": "Hola món",
"enter": 42,
"decimal": 3.14159,
"booleà": true,
"nul": null,
"objecte": { "clau": "valor" },
"array": [1, 2, 3, "quatre"]
}
Regles sintàctiques
- Claus sempre entre cometes dobles
"clau" - Strings sempre entre cometes dobles
- No s'admeten comentaris
- No s'admeten comes final (trailing commas)
- Codificació recomanada: UTF-8
Objectes anidats
{
"alumne": {
"id": 1234,
"nom": "Joan Garcia",
"cicle": {
"codi": "ASIX",
"curs": "1r"
},
"moduls": [
{ "codi": "M0373", "nom": "LMSGI", "hores": 99 },
{ "codi": "M0372", "nom": "GBD", "hores": 132 }
],
"aprovats": true,
"nota_acces": null
}
}
Arrays
{
"colors": ["vermell", "verd", "blau"],
"notes": [7.5, 8.0, 6.5, 9.0],
"matriu": [[1, 2], [3, 4], [5, 6]],
"persones": [
{ "nom": "Joan", "edat": 22 },
{ "nom": "Maria", "edat": 25 }
]
}
JSON vs XML
| Característica | JSON | XML |
|---|---|---|
| Llegibilitat | Alta (menys verbós) | Bona (més verbós) |
| Comentaris | No | Sí |
| Atributs | No (tot com a propietats) | Sí |
| Namespaces | No | Sí |
| Esquema | JSON Schema | DTD, XSD |
| Transformació | jq, JavaScript | XSLT |
| Consultes | JSONPath | XPath, XQuery |
| Arrays | Natiu | Requereix convencions |
| Binaris | Base64 | Base64 (CDATA) |
| Pes | Menor | Major |
Mateixa informació en JSON i XML
{
"biblioteca": {
"llibres": [
{
"isbn": "L001",
"idioma": "ca",
"titol": "Tirant lo Blanc",
"autor": { "nom": "Joanot", "cognom": "Martorell" },
"any": 1490,
"preu": 25.90
}
]
}
}
<biblioteca>
<llibre isbn="L001" idioma="ca">
<titol>Tirant lo Blanc</titol>
<autor><nom>Joanot</nom><cognom>Martorell</cognom></autor>
<any>1490</any>
<preu>25.90</preu>
</llibre>
</biblioteca>
Validació amb JSON Schema
JSON Schema defineix l'estructura i els tipus d'un document JSON:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Alumne",
"type": "object",
"required": ["id", "nom", "cicle"],
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"nom": {
"type": "string",
"minLength": 2,
"maxLength": 100
},
"cicle": {
"type": "string",
"enum": ["ASIX", "DAW", "DAM", "SMIX"]
},
"nota": {
"type": "number",
"minimum": 0,
"maximum": 10
},
"moduls": {
"type": "array",
"items": {
"type": "object",
"required": ["codi", "nom"],
"properties": {
"codi": { "type": "string", "pattern": "^M[0-9]{4}$" },
"nom": { "type": "string" },
"hores": { "type": "integer", "minimum": 1 }
}
}
}
}
}
Exportació XML ↔ JSON
Python: XML → JSON
import xml.etree.ElementTree as ET
import json
def xml_to_dict(element):
result = {}
if element.attrib:
result.update(element.attrib)
for child in element:
child_data = xml_to_dict(child)
if child.tag in result:
if not isinstance(result[child.tag], list):
result[child.tag] = [result[child.tag]]
result[child.tag].append(child_data)
else:
result[child.tag] = child_data
if element.text and element.text.strip():
if result:
result['_text'] = element.text.strip()
else:
return element.text.strip()
return result
tree = ET.parse('biblioteca.xml')
root = tree.getroot()
data = {root.tag: xml_to_dict(root)}
print(json.dumps(data, ensure_ascii=False, indent=2))
Miniactivitat AC03742
Pren el fitxer institut.xml del RA1 i converteix-lo manualment a JSON. Crea també un JSON Schema que el validi. Usa l'eina online jsonschemavalidator.net per verificar la validació.