Lokale JSON-Datei laden in React Native
Lokale JSON-Datei laden
~8 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Nicht jede Datenquelle kommt aus dem Netzwerk – App-interne Konfigurationen, Übersetzungen oder Demo-Daten liegen oft als JSON-Datei direkt im Projekt. React Native lädt diese anders als eine Netzwerk-URL: über require() statt fetch().
1. Beschreibung
Der Metro-Bundler (React Natives JavaScript-Bundler) erkennt .json-Dateien automatisch und importiert sie als fertig geparstes JavaScript-Objekt – kein fetch(), kein await, keine Fehlerbehandlung nötig, da die Datei zur Build-Zeit fest eingebettet wird.
2. Kurzes Beispiel
import produkte from './daten/produkte.json';
console.log(produkte[0].name); // sofort verfügbar, kein Laden nötig3. Komplettes Projekt: Offline-Rezeptbuch
npx create-expo-app local-json-demo
cd local-json-demo[
{ "id": 1, "titel": "Tomatensuppe", "minuten": 25, "zutaten": ["Tomaten", "Zwiebel", "Brühe"] },
{ "id": 2, "titel": "Pfannkuchen", "minuten": 15, "zutaten": ["Mehl", "Milch", "Ei"] },
{ "id": 3, "titel": "Gemüsecurry", "minuten": 35, "zutaten": ["Kokosmilch", "Curry", "Gemüse"] }
]import { useState } from 'react';
import { View, Text, FlatList, TouchableOpacity, StyleSheet } from 'react-native';
import rezepte from './daten/rezepte.json';
export default function App() {
const [ausgewaehlteId, setAusgewaehlteId] = useState(null);
return (
<FlatList
contentContainerStyle={styles.liste}
data={rezepte}
keyExtractor={(item) => String(item.id)}
renderItem={({ item }) => {
const offen = item.id === ausgewaehlteId;
return (
<TouchableOpacity
style={styles.karte}
onPress={() => setAusgewaehlteId(offen ? null : item.id)}
>
<Text style={styles.titel}>{item.titel}</Text>
<Text style={styles.zeit}>{item.minuten} Minuten</Text>
{offen && (
<Text style={styles.zutaten}>
Zutaten: {item.zutaten.join(', ')}
</Text>
)}
</TouchableOpacity>
);
}}
/>
);
}
const styles = StyleSheet.create({
liste: { paddingTop: 60, paddingHorizontal: 16 },
karte: { backgroundColor: '#f3f4f6', padding: 14, borderRadius: 10, marginBottom: 10 },
titel: { fontSize: 16, fontWeight: 'bold' },
zeit: { color: '#6b7280', marginTop: 2 },
zutaten: { marginTop: 8, color: '#374151' },
});4. Erklärung
import rezepte from './daten/rezepte.json'stattfetch('./daten/rezepte.json')– Letzteres würde in React Native NICHT funktionieren, da es kein Dateisystem-URL-Schema wie im Browser gibt.- Weil die Daten schon zur Build-Zeit eingebettet sind, gibt es keinen Lade- oder Fehlerzustand –
rezepteist beim ersten Rendern bereits vollständig vorhanden. - Nachteil dieses Ansatzes: die Daten sind FEST im App-Paket – zum Aktualisieren muss die App neu gebaut und veröffentlicht werden, anders als bei Netzwerk-Daten (siehe Kapitel "Axios"/"Fetch").
- Der Auf-/Zuklapp-Mechanismus (
ausgewaehlteId-State) folgt demselben Muster wie das "Dumb Components"-Kapitel – hier direkt in derrenderItem-Funktion statt in einer ausgelagerten Komponente, weil die Logik kurz genug ist.