Parsing og behandling av JSON- og XML-data.
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
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 → NoneLat 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.
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 (æ, ø, å)
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.
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 -->
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: 6XML er meir komplisert å jobbe med enn JSON, men naudsynt for mange API-ar og datasystem.
✅ 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)
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
| Begrep | Forklaring |
|---|---|
| Parsing | Å lese og tolke data til objekter |
| Serialisering | Å konvertere objekter til et lagringsformat |
| XML | Markup-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.