Tilbake
4.3
Dataformater – JSON og XML

4.3 Dataformater – JSON og XML

Parsing og behandling av JSON- og XML-data.

55 min
6 oppgaver
JSONXMLParsingSerialisering
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 6 oppgaver

Når program skal utveksle data, treng dei eit felles format som begge forstår. Dei to mest brukte formata for datautveksling er JSON (JavaScript Object Notation) og XML (eXtensible Markup Language).

I dette kapittelet skal vi sjå nærare på:
- Korleis JSON og XML er strukturert
- Parsing (lesing) av JSON og XML i Python
- Serialisering (skriving) av data til JSON
- Når du bør velje JSON vs XML
- Arbeid med nesta datastrukturar

Parsing og serialisering
Parsing tyder å lese og tolke data frå eit format (som JSON eller XML) til Python-objekt (dictionaries, lister osv.).

Serialisering tyder å konvertere Python-objekt til eit tekstformat (som JSON eller XML) som kan lagrast eller sendast over nettverket.

- JSON → Python: Parsing
- Python → JSON: Serialisering

Python har ein innebygd json-modul som gjer det enkelt å arbeide med JSON-data.

Viktige funksjonar:
- json.loads() – Parse JSON-string til Python-objekt
- json.dumps() – Serialiser Python-objekt til JSON-string
- json.load() – Les JSON frå fil
- json.dump() – Skriv JSON til fil

JSON-typar → Python-typar:

JSON          Python
------------------
object    →   dict
array     →   list
string    →   str
number    →   int/float
true      →   True
false     →   False
null      →   None

✏️Eksempel: Parse JSON-string

Lat oss parse ein JSON-string til eit Python-objekt:

import json

# JSON-string
json_data = '''
{
  "navn": "Emma Hansen",
  "alder": 18,
  "fag": ["Matematikk", "IT", "Fysikk"],
  "aktiv": true,
  "karakter": null
}
'''

# Parse JSON til Python dictionary
student = json.loads(json_data)

# Nå kan vi jobbe med det som et vanlig Python-objekt
print(f"Navn: {student['navn']}")
print(f"Alder: {student['alder']}")
print(f"Fag: {', '.join(student['fag'])}")
print(f"Aktiv: {student['aktiv']}")
print(f"Type: {type(student)}")

Output:

Navn: Emma Hansen
Alder: 18
Fag: Matematikk, IT, Fysikk
Aktiv: True
Type: <class 'dict'>

JSON-objektet vart konvertert til ein Python dictionary.

✏️Eksempel: Serialiser til JSON

No skal vi konvertere eit Python-objekt til JSON:

import json

# Python dictionary
student = {
    'navn': 'Lars Olsen',
    'alder': 17,
    'fag': ['Norsk', 'Engelsk', 'Historie'],
    'aktiv': True,
    'karakter': None
}

# Konverter til JSON-string
json_string = json.dumps(student)
print(json_string)

# Med formatering for bedre lesbarhet
json_formatert = json.dumps(student, indent=2, ensure_ascii=False)
print("\nFormatert:")
print(json_formatert)

Output:

{"navn": "Lars Olsen", "alder": 17, "fag": ["Norsk", "Engelsk", "Historie"], "aktiv": true, "karakter": null}

Formatert:
{
  "navn": "Lars Olsen",
  "alder": 17,
  "fag": [
    "Norsk",
    "Engelsk",
    "Historie"
  ],
  "aktiv": true,
  "karakter": null
}

Parametre:
- indent=2: Legger til innrykk for lesbarhet
- ensure_ascii=False: Beholder norske tegn (æ, ø, å)

✏️Eksempel: Lese og skrive JSON-filer

Her er korleis vi arbeider med JSON-filer:

import json

# Data vi vil lagre
data = {
    'skole': 'Oslo Videregående',
    'elever': [
        {'navn': 'Emma', 'alder': 18, 'trinn': 'VG3'},
        {'navn': 'Lars', 'alder': 17, 'trinn': 'VG2'},
        {'navn': 'Sara', 'alder': 16, 'trinn': 'VG1'}
    ],
    'antall': 3
}

# Skriv til fil
with open('skoledata.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=2, ensure_ascii=False)

print("Data lagret til skoledata.json")

# Les fra fil
with open('skoledata.json', 'r', encoding='utf-8') as f:
    innlest_data = json.load(f)

print(f"\nSkole: {innlest_data['skole']}")
print(f"Antall elever: {innlest_data['antall']}")

for elev in innlest_data['elever']:
    print(f"- {elev['navn']} ({elev['trinn']})")

Output:

Data lagret til skoledata.json

Skole: Oslo Videregående
Antall elever: 3
- Emma (VG3)
- Lars (VG2)
- Sara (VG1)

Dette er nyttig for å lagre konfigurasjonar eller data lokalt.

JSON kan ha nesta objekt og lister, som gjer det mogleg å representere komplekse datastrukturar.

Eksempel på nesta JSON:

{
  "skole": "Oslo VGS",
  "klasser": [
    {
      "navn": "3A",
      "elever": [
        {"navn": "Emma", "karakterer": [5, 6, 5]},
        {"navn": "Lars", "karakterer": [4, 5, 6]}
      ]
    }
  ]
}

Tilgang til nesta data:

data = json.loads(json_string)

# Tilgang til nestet data
klasse_navn = data['klasser'][0]['navn']
første_elev = data['klasser'][0]['elever'][0]['navn']
første_karakter = data['klasser'][0]['elever'][0]['karakterer'][0]

print(f"Klasse: {klasse_navn}")
print(f"Første elev: {første_elev}")
print(f"Første karakter: {første_karakter}")

Du navigerer gjennom strukturen ved å bruke [] for lister og ['key'] for dictionaries.

XML (eXtensible Markup Language)
XML er eit markup-språk som blir brukt til å strukturere data. XML brukar tags (liknande HTML) for å organisere informasjon.

Eksempel:

<?xml version="1.0" encoding="UTF-8"?>
<student>
  <navn>Emma Hansen</navn>
  <alder>18</alder>
  <fag>
    <fag>Matematikk</fag>
    <fag>IT</fag>
  </fag>
</student>

Eigenskapar:
- Meir verbose (ordrik) enn JSON
- Støttar attributtar: <elev id="123">
- Blir mykje brukt i eldre system og bedriftsapplikasjonar
- Støttar kommentarar: <!-- kommentar -->

✏️Eksempel: Parse XML i Python

Python har ein innebygd modul for XML: xml.etree.ElementTree

import xml.etree.ElementTree as ET

# XML-data
xml_data = '''
<?xml version="1.0"?>
<skole>
  <elev id="1">
    <navn>Emma Hansen</navn>
    <alder>18</alder>
    <karakter>5</karakter>
  </elev>
  <elev id="2">
    <navn>Lars Olsen</navn>
    <alder>17</alder>
    <karakter>6</karakter>
  </elev>
</skole>
'''

# Parse XML
root = ET.fromstring(xml_data)

# Iterer over elever
for elev in root.findall('elev'):
    elev_id = elev.get('id')  # Hent attributt
    navn = elev.find('navn').text
    alder = elev.find('alder').text
    karakter = elev.find('karakter').text

    print(f"ID: {elev_id} - {navn}, {alder} år, karakter: {karakter}")

Output:

ID: 1 - Emma Hansen, 18 år, karakter: 5
ID: 2 - Lars Olsen, 17 år, karakter: 6

XML er meir komplisert å jobbe med enn JSON, men naudsynt for mange API-ar og datasystem.

JSON:
✅ Enklare og meir kompakt
✅ Lettare å lese for menneske
✅ Naturleg mapping til Python-objekt
✅ Standard for moderne web-API-ar
✅ Raskare å parse
❌ Inga støtte for kommentarar
❌ Ingen dokumentskjema (XSD)

XML:
✅ Støttar attributtar
✅ Støttar kommentarar
✅ Skjemavalidering (XSD, DTD)
✅ Betre for dokumentorientert data
❌ Meir verbose (tek meir plass)
❌ Vanskelegare å parse
❌ Mindre eigna for web-API-ar

Tommelfingerregel:
- Bruk JSON for moderne web-API-ar og enkle datastrukturar
- Bruk XML når du må (eldre system, SOAP, RSS-feeds)

✏️Praktisk eksempel: Værdata med JSON

Lat oss hente værdata frå eit API og lagre det som JSON:

import requests
import json
from datetime import datetime

def hent_og_lagre_vaer(by):
    """Hent værdata og lagre til JSON-fil"""
    url = 'https://api.open-meteo.com/v1/forecast'
    params = {
        'latitude': 59.91 if by == 'Oslo' else 60.39,
        'longitude': 10.75 if by == 'Oslo' else 5.32,
        'current_weather': True
    }

    response = requests.get(url, params=params)

    if response.status_code == 200:
        data = response.json()

        # Lag strukturert data
        vaerdata = {
            'by': by,
            'tidspunkt': datetime.now().isoformat(),
            'temperatur': data['current_weather']['temperature'],
            'vindhastighet': data['current_weather']['windspeed'],
            'vaerkode': data['current_weather']['weathercode']
        }

        # Lagre til fil
        filnavn = f'{by.lower()}_vaer.json'
        with open(filnavn, 'w', encoding='utf-8') as f:
            json.dump(vaerdata, f, indent=2, ensure_ascii=False)

        print(f"Værdata for {by} lagret i {filnavn}")
        return vaerdata
    else:
        print(f"Kunne ikke hente værdata: {response.status_code}")
        return None

# Test
oslo_vaer = hent_og_lagre_vaer('Oslo')
if oslo_vaer:
    print(f"\nTemperatur i Oslo: {oslo_vaer['temperatur']}°C")

Dette viser praktisk bruk av både API-kall og JSON-filhandtering.

Oppsummering

I dette kapittelet har du lært:

- Parsing: lese eit format (JSON/XML) til Python-objekt.
- Serialisering: konvertere Python-objekt til eit format.
- JSON: vanlegaste dataformat, lese/skrive med json-modulen.
- XML: markup-språk med tagger for å strukturere data.
- Filhaandtering: lese og skrive JSON-filer.

Noekkelbegreper


BegrepForklaring
ParsingÅ lese og tolke data til objekter
SerialiseringÅ konvertere objekter til et lagringsformat
XMLMarkup-språk for strukturerte data

Oppgaver

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.