Start · Sprachen · JavaScript · Referenz · GeolocationPosition.toJSON()

GeolocationPosition.toJSON()

Methode

Gibt ein einfaches Objekt mit <code>coords</code> und <code>timestamp</code> zurück, sodass sich ein <code>GeolocationPosition</code> direkt mit <code>JSON.stringify()</code> serialisieren lässt.

seit JavaScript Baseline 2024: Chrome 125+, Edge 125+, Firefox 127 Kategorie: webapi

Signatur

GeolocationPosition.prototype.toJSON()

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

Typ
Object
Beschreibung
Ein einfaches Objekt der Form { 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}`)
);
{ "coords": { "accuracy": 20, "latitude": 52.52, "longitude": 13.405, "altitude": null, "altitudeAccuracy": null, "heading": null, "speed": null }, "timestamp": 1718000000000 }

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();
Gesendet: 200

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());
});
52.52 2024-06-10T06:13:20.000Z

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));
  }
});
{"coords":{"latitude":52.52,"longitude":13.405,"accuracy":20},"timestamp":1718000000000}

// 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 mit typeof position.toJSON === 'function' oder übernehmen Sie die Werte von Hand.
  • Keine Rückrichtung: Das Ergebnis ist ein gewöhnliches Objekt und keine GeolocationPosition-Instanz. Nach JSON.parse() ist instanceof GeolocationPosition daher false.
  • Spread und Object.assign: Auch {...position} und Object.keys(position) liefern leere Ergebnisse. Arbeiten Sie deshalb mit position.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).
  • timestamp ist ein Zeitstempel in Millisekunden seit der Unix-Epoche (EpochTimeStamp) und kein Date-Objekt.