Signatur
Beschreibung
Die Methode toJSON() des Interfaces GeolocationPosition ist ein Serialisierer. Sie gibt ein gewöhnliches JavaScript-Objekt zurück, das alle Daten der Position enthält: die Eigenschaft timestamp und ein verschachteltes Objekt coords. Für coords wird intern GeolocationCoordinates.toJSON() aufgerufen. Das Objekt enthält also latitude, longitude, altitude, accuracy, altitudeAccuracy, heading und speed.
Wozu braucht man das? Die Eigenschaften von GeolocationPosition sind Getter auf dem Prototyp und keine eigenen Eigenschaften des Objekts. Ohne toJSON() liefert JSON.stringify(position) deshalb nur "{}". Mit der Methode werden die Werte korrekt serialisiert. JSON.stringify() ruft toJSON() automatisch auf, Sie müssen die Methode also meist gar nicht selbst aufrufen.
Typische Einsätze sind das Senden einer Position per fetch() an einen Server, das Speichern in localStorage oder IndexedDB, die Übergabe an einen Worker und das Protokollieren beim Debuggen. Wenn Sie das Ergebnis mit Spread-Syntax oder structuredClone() weiterverarbeiten wollen, rufen Sie toJSON() direkt auf.
Rückgabewert
{ coords: { accuracy, latitude, longitude, altitude, altitudeAccuracy, heading, speed }, timestamp }. Werte, die nicht verfügbar sind, stehen dort als null.Beispiele
Position als JSON-String ausgeben
navigator.geolocation.getCurrentPosition(
(position) => {
// JSON.stringify ruft toJSON() automatisch auf
console.log(JSON.stringify(position, null, 2));
},
(error) => console.error(`Fehler ${error.code}: ${error.message}`)
);
Position per fetch an einen Server senden
const getPosition = (options) =>
new Promise((resolve, reject) =>
navigator.geolocation.getCurrentPosition(resolve, reject, options)
);
const sendLocation = async () => {
try {
const position = await getPosition({ enableHighAccuracy: true, timeout: 10000 });
const response = await fetch('/api/location', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userId: 42, position })
});
console.log('Gesendet:', response.status);
} catch (err) {
console.error('Standort konnte nicht gesendet werden:', err.message);
}
};
sendLocation();
Letzte Position in localStorage speichern
navigator.geolocation.getCurrentPosition((position) => {
const plain = position.toJSON();
localStorage.setItem('lastPosition', JSON.stringify(plain));
const restored = JSON.parse(localStorage.getItem('lastPosition'));
console.log(restored.coords.latitude, new Date(restored.timestamp).toISOString());
});
Vergleich: ohne toJSON() (ältere Browser)
navigator.geolocation.getCurrentPosition((position) => {
if (typeof position.toJSON !== 'function') {
// Fallback: Werte von Hand übernehmen
const { latitude, longitude, accuracy } = position.coords;
console.log(JSON.stringify({ coords: { latitude, longitude, accuracy }, timestamp: position.timestamp }));
} else {
console.log(JSON.stringify(position));
}
});
// Wichtig · Fallstricke
- Kompatibilität: Die Methode ist noch relativ neu (seit 2024: Chrome/Edge 125, Firefox 127, Safari 17.5). In älteren Browsern liefert
JSON.stringify(position)nur"{}", weil die Eigenschaften Getter auf dem Prototyp sind. Wenn Sie ältere Browser unterstützen müssen, prüfen Sie vorher mittypeof position.toJSON === 'function'oder übernehmen Sie die Werte von Hand. - Keine Rückrichtung: Das Ergebnis ist ein gewöhnliches Objekt und keine
GeolocationPosition-Instanz. NachJSON.parse()istinstanceof GeolocationPositiondaherfalse. - Spread und Object.assign: Auch
{...position}undObject.keys(position)liefern leere Ergebnisse. Arbeiten Sie deshalb mitposition.toJSON(). - Datenschutz: Standortdaten sind personenbezogene Daten. Übertragen Sie sie nur über HTTPS und nur mit Einwilligung, und speichern Sie sie nicht unnötig lange in
localStorage. Die Geolocation-API selbst funktioniert nur in einem sicheren Kontext (HTTPS). timestampist ein Zeitstempel in Millisekunden seit der Unix-Epoche (EpochTimeStamp) und keinDate-Objekt.