Salta el contingut

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
Atributs No (tot com a propietats)
Namespaces No
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ó.