Kurz gesagt
In PHP wandelst du eine INI-Datei in zwei Schritten nach JSON: parse_ini_file($pfad, true) liest die Datei als assoziatives Array ein und behält dabei die Sektionen, json_encode($daten, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) erzeugt daraus lesbares JSON. Beide Funktionen gehören zum PHP-Kern, du brauchst kein zusätzliches Paket. Der wichtigste Stolperstein: INI kennt keine Datentypen, also kommen Zahlen als Strings an. Echte Zahlen im JSON musst du selbst per Cast erzeugen. Für eine schnelle einmalige Umwandlung ohne Code nutzt du direkt den INI-zu-JSON-Konverter, der alles lokal im Browser erledigt.
Die zwei Bausteine: parse_ini_file und json_encode
PHP bringt für diese Aufgabe alles mit, was du brauchst, ohne Composer-Paket und ohne externe Bibliothek. Die ganze Umwandlung steht und fällt mit zwei eingebauten Funktionen.
parse_ini_file() liest eine INI-Datei vom Dateisystem und gibt sie als assoziatives Array zurück. Die Funktion versteht die typische INI-Struktur: Sektionsköpfe in eckigen Klammern wie [server], Schlüssel-Wert-Paare in der Form key = value sowie Kommentarzeilen, die mit einem Semikolon beginnen. Sie ist bewusst schlank und nimmt dir das Zeilen-Parsen vollständig ab.
json_encode() macht den Rückweg: Sie nimmt ein PHP-Array oder -Objekt und serialisiert es zu einem JSON-String. Über sogenannte Flags steuerst du Aussehen und Verhalten, allen voran JSON_PRETTY_PRINT für eingerücktes JSON und JSON_UNESCAPED_UNICODE, damit Umlaute als ä, ö, ü erscheinen und nicht als ä maskiert werden.
Mehr ist es im Kern nicht. Die eigentliche Arbeit liegt in den Details: in der richtigen Behandlung von Sektionen, in der Wahl des passenden Scanner-Modus und im bewussten Umgang mit Datentypen. Genau diese Punkte gehen wir jetzt durch.
Schritt für Schritt: INI nach JSON
Nehmen wir eine kleine Konfigurationsdatei config.ini mit zwei Sektionen als Ausgangspunkt:
; Datenbank-Konfiguration
[database]
host = localhost
port = 5432
name = meine_app
ssl = true
[cache]
driver = redis
ttl = 3600 Das folgende Skript liest diese Datei ein und gibt sauberes JSON aus. Es ist vollständig und lauffähig, du kannst es direkt übernehmen:
<?php
$pfad = __DIR__ . '/config.ini';
// Schritt 1: INI einlesen, Sektionen erhalten (zweiter Parameter true)
$daten = parse_ini_file($pfad, true);
// Schritt 2: Fehler abfangen
if ($daten === false) {
fwrite(STDERR, "INI-Datei konnte nicht gelesen werden.\n");
exit(1);
}
// Schritt 3: JSON erzeugen, lesbar und mit echten Umlauten
$json = json_encode(
$daten,
JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
);
// Schritt 4: ausgeben (oder mit file_put_contents speichern)
echo $json . PHP_EOL; Das Ergebnis sieht so aus:
{
"database": {
"host": "localhost",
"port": "5432",
"name": "meine_app",
"ssl": "1"
},
"cache": {
"driver": "redis",
"ttl": "3600"
}
}
Zwei Dinge fallen sofort auf. Erstens: Jede Sektion ist zu einem verschachtelten Objekt geworden, genau wie gewünscht. Zweitens: port und ttl stehen als Strings im JSON, und aus ssl = true ist die Zeichenkette "1" geworden. Beides ist kein Fehler, sondern eine direkte Folge davon, wie INI und parse_ini_file arbeiten. Wir kümmern uns gleich darum.
Sektionen erhalten mit process_sections
Der zweite Parameter von parse_ini_file heißt process_sections und ist der wichtigste Schalter überhaupt. Sein Standardwert ist false, und das führt zu einer typischen Verwirrung.
Mit process_sections = false ignoriert PHP die Sektionsköpfe und legt alle Schlüssel flach in einer einzigen Ebene ab. Aus der Beispieldatei oben würde dann ein Array mit den Schlüsseln host, port, name, ssl, driver und ttl direkt nebeneinander. Die Information, welcher Schlüssel zu welcher Sektion gehört, geht verloren. Schlimmer noch: Gibt es denselben Schlüssel in zwei Sektionen, überschreibt der zweite den ersten still und leise.
Deshalb gilt die Regel: Sobald deine INI-Datei Sektionen hat und du sie im JSON abbilden willst, übergibst du true als zweiten Parameter. Nur dann entsteht die verschachtelte Struktur, die JSON natürlich abbildet. Wie verschachtelte Sektionen und die Punktnotation funktionieren, vertiefen wir im Ratgeber Verschachtelte INI-Sektionen in JSON abbilden.
Scanner-Modi: NORMAL, RAW und TYPED
Der dritte Parameter scanner_mode steuert, wie PHP die Werte interpretiert. Er wird oft übersehen, entscheidet aber maßgeblich über das Ergebnis. Es gibt drei Modi:
| Modus | Verhalten |
|---|---|
INI_SCANNER_NORMAL | Standard. Wandelt on/true/yes in "1" und off/false/no/none in "" um. Konstanten werden aufgelöst. |
INI_SCANNER_RAW | Lässt jeden Wert exakt so, wie er in der Datei steht. Keine Umwandlung von on/off, keine Konstanten. |
INI_SCANNER_TYPED | Liefert echte Datentypen: true/false als Boolean, Zahlen als int oder float, null als null. |
Für eine möglichst typgerechte Umwandlung nach JSON ist INI_SCANNER_TYPED die interessanteste Wahl. Damit kümmert sich PHP selbst um die Typisierung, und im JSON erscheinen Zahlen als Zahlen und Wahrheitswerte als Boolean:
<?php
$daten = parse_ini_file('config.ini', true, INI_SCANNER_TYPED);
echo json_encode($daten, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// Ergebnis (Auszug):
// "port": 5432,
// "ssl": true,
// "ttl": 3600
Willst du dagegen jeden Wert wortwörtlich übernehmen, etwa weil eine Versionsnummer wie 1.20 nicht zur Zahl 1.2 werden darf, nimmst du INI_SCANNER_RAW. Welcher Modus richtig ist, hängt also vom Inhalt deiner Datei ab. Es gibt hier keine universell beste Wahl, sondern eine bewusste Entscheidung.
Datentyp-Fallstricke und wie du sie löst
Die Datentypen sind die häufigste Quelle für Überraschungen. Der Kern des Problems: INI ist ein reines Textformat, es kennt keine Typen. Ob 3600 eine Zahl, ein Timeout in Sekunden oder eine ID ist, steht nirgends. Erst PHP entscheidet beim Einlesen, wie es den Wert deutet. Drei Fallstricke begegnen einem in der Praxis besonders oft.
Führende Nullen verschwinden
Eine Postleitzahl 04109 oder ein Pincode 007 wird im TYPED-Modus zur Zahl 4109 beziehungsweise 7, die führende Null geht verloren. Ist das nicht gewollt, lies solche Felder mit RAW ein oder caste sie bewusst zurück zu String.
Versionsnummern werden zu Floats
Aus version = 1.10 wird im TYPED-Modus der Float 1.1, das abschließende Null-Zeichen fällt weg. Versionen, IBANs und Telefonnummern gehören deshalb fast immer in den RAW-Modus oder explizit als String behandelt.
Gezieltes Casten einzelner Felder
Oft willst du nur einzelne Felder als Zahl, den Rest aber als Text. Dann liest du mit NORMAL oder RAW ein und castest gezielt:
<?php
$daten = parse_ini_file('config.ini', true);
// nur diese Felder zu echten Zahlen machen
$daten['database']['port'] = (int) $daten['database']['port'];
$daten['cache']['ttl'] = (int) $daten['cache']['ttl'];
// ssl als echtes Boolean
$daten['database']['ssl'] = $daten['database']['ssl'] === '1';
echo json_encode($daten, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); Dieser kontrollierte Weg ist in produktivem Code meist der sicherste: Du behältst die volle Kontrolle und vermeidest, dass eine automatische Heuristik einen Wert falsch deutet. Genau diese Heuristik und ihre Tücken beleuchtet auch der Ratgeber INI-Datentypen in JSON ausführlich.
php.ini als praktisches Beispiel
Ein naheliegender Anwendungsfall ist die php.ini selbst, die zentrale Konfigurationsdatei des PHP-Interpreters. Sie als JSON zu betrachten hilft beim Vergleich von Umgebungen, beim Dokumentieren oder beim Einspeisen in ein Monitoring. Hier gibt es zwei Wege, und sie führen zu unterschiedlichen Ergebnissen.
Weg 1: die Datei direkt parsen. Du kannst die php.ini wie jede andere INI-Datei einlesen. Wichtig ist hier der RAW-Modus, weil die php.ini Werte wie On, Off und Konstanten wie E_ALL enthält, die du in der Regel im Original behalten willst:
<?php
$pfad = php_ini_loaded_file(); // Pfad zur aktiven php.ini
$daten = parse_ini_file($pfad, true, INI_SCANNER_RAW);
echo json_encode($daten, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); Weg 2: die aktiven Laufzeitwerte abfragen. Oft interessiert dich nicht der Dateiinhalt, sondern was PHP tatsächlich anwendet. Direktiven werden nämlich auch durch zusätzliche .ini-Dateien, Webserver-Konfiguration oder ini_set() verändert. Die wahren Werte liefert ini_get_all():
<?php
// alle Direktiven mit globalem und lokalem Wert
$alle = ini_get_all(null, true);
echo json_encode($alle, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// nur eine Gruppe, etwa alle date-Einstellungen
$datum = ini_get_all('date', true);
Welcher Weg passt, hängt vom Ziel ab: Die Datei spiegelt die Absicht, ini_get_all() die Realität. Was die wichtigsten Direktiven der php.ini bedeuten und worauf du bei sensiblen Werten achten musst, erklärt der Ratgeber php.ini verstehen und nach JSON konvertieren.
INI aus einem String statt einer Datei
Manchmal liegt das INI nicht als Datei vor, sondern als String, etwa aus einem Formularfeld, einer Datenbankspalte oder einer API-Antwort. Dafür gibt es die Schwesterfunktion parse_ini_string(), die dieselben Parameter wie parse_ini_file() kennt, aber direkt einen String entgegennimmt:
<?php
$ini = "[app]\nname = Demo\ndebug = false\n";
$daten = parse_ini_string($ini, true, INI_SCANNER_TYPED);
echo json_encode($daten, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// {
// "app": {
// "name": "Demo",
// "debug": false
// }
// }
Beachte beim Verarbeiten fremder Eingaben: Schlüsselwörter wie null, yes, no, true und false sowie die Zeichen | & ~ ! ( ) haben in INI eine besondere Bedeutung. Sollen sie als reiner Text durchgereicht werden, müssen die Werte in Anführungszeichen stehen. Das ist ein Grund mehr, bei unsicheren Quellen über RAW nachzudenken.
Wann ein Browser-Tool die bessere Wahl ist
PHP ist ideal, wenn die Umwandlung Teil eines Skripts, eines Deployments oder einer laufenden Anwendung ist und automatisiert ablaufen soll. Für eine einmalige Aufgabe ist der Aufwand aber oft unverhältnismäßig: Du brauchst eine PHP-Umgebung, schreibst ein kleines Skript, prüfst Pfade und Berechtigungen.
Für genau diese Fälle ist ein Browser-Konverter schneller. Du öffnest ini-json.de, fügst dein INI ein oder wählst die Datei aus, stellst Einrückung und Typ-Heuristik ein und kopierst das fertige JSON. Es ist nichts zu installieren, und der entscheidende Punkt: Die Datei verlässt deinen Browser nicht. Es gibt keinen Upload und keinen Server, was besonders wichtig ist, wenn die Konfiguration Passwörter oder Schlüssel enthält. Warum dieser Unterschied für die Sicherheit zählt, behandelt der Ratgeber INI und JSON sicher umwandeln.
Eine ehrliche Einordnung: Das Browser-Tool nutzt eine gängige INI-Auslegung mit abschaltbarer Typ-Heuristik, während dir PHP über die Scanner-Modi und gezieltes Casten feinere Kontrolle gibt. Für schnelle Umwandlungen und zum Prüfen ist das Tool perfekt, für komplexe, wiederkehrende Pipelines greifst du zu PHP.
INI ohne PHP direkt umwandeln
Kein Skript nötig: Füge dein INI ein und erhalte sofort sauberes JSON, mit wählbarer Einrückung und Typ-Heuristik, zu 100 Prozent lokal im Browser.
Zum INI-zu-JSON-KonverterHäufige Fragen
Wie wandle ich eine INI-Datei mit PHP in JSON um?
Lies die Datei mit parse_ini_file($pfad, true) ein, das ergibt ein assoziatives Array mit Sektionen. Gib es dann mit json_encode($daten, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) als JSON aus. Beide Funktionen gehören zum PHP-Standardumfang.
Was bewirkt der zweite Parameter von parse_ini_file?
Mit true bleibt jede [section] als eigenes verschachteltes Array erhalten und wird im JSON zum Objekt. Mit false werden alle Schlüssel flach zusammengeführt und die Sektionsnamen gehen verloren.
Warum werden meine Zahlen in JSON zu Strings?
Weil INI alles als Text speichert. Im Standardmodus liefert parse_ini_file Strings. Für echte Zahlen nutzt du INI_SCANNER_TYPED oder castest die betreffenden Felder selbst mit (int) oder (float).
Kann ich die php.ini selbst mit parse_ini_file lesen?
Ja, am besten mit INI_SCANNER_RAW, damit On, Off und Konstanten unverändert bleiben. Die tatsächlich aktiven Laufzeitwerte bekommst du aber zuverlässiger über ini_get_all().
Brauche ich PHP überhaupt, oder reicht ein Browser-Tool?
Für einmalige Umwandlungen oder zum Prüfen ist ein Browser-Tool wie ini-json.de schneller, weil nichts installiert wird und die Datei lokal bleibt. PHP lohnt sich, wenn die Umwandlung automatisiert in einem Skript oder einer Anwendung ablaufen soll.
Weiterführende Artikel
Quellen und Methodik
Grundlage sind das offizielle PHP-Handbuch zu den Funktionen parse_ini_file, parse_ini_string, json_encode und ini_get_all sowie den Konstanten INI_SCANNER_NORMAL, INI_SCANNER_RAW und INI_SCANNER_TYPED (php.net). Alle Codebeispiele wurden mit PHP 8 nachvollzogen. Das Verhalten von INI als typloses Textformat folgt der gängigen, im Tool dokumentierten Auslegung. Zuletzt geprüft am 25.06.2026.