Powershell Fehlermeldung ConvertFrom-Json : Ungültiger JSON-Primitiv: ..


Beim Versuch eine absolut simple JSON-Datei in Windows Powershell 5.1 einzulesen erschien die Fehlermeldung:

ConvertFrom-Json : Ungültiger JSON-Primitiv: ..
In Zeile:1 Zeichen:1
+ ConvertFrom-Json .\settings.json
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [ConvertFrom-Json], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

Ich bin schon mehrfach über dieses Problem gestolpert, wie andere auch, jedoch war es noch nie so klar wie in diesem Fall, woran das Problem liegt. Wieso das Problem so offensichtlich gelöst werden konnte, lag daran, dass die JSON-Datei absolut simple war:

{
"files.encoding": "cp850"
}

Obwohl die Datei offensichtlich korrekt aussieht, beschwert sich ConvertFrom-JSON. Als ich mir dann die Datei in Hex angeschaut habe, wurde aber schnell offensichtlich was das Problem ist:

PS > Format-Hex .\settings.json

           Pfad: .\settings.json

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   7B 0A 20 20 20 20 22 66 69 6C 65 73 2E 65 6E 63  {.    "files.enc
00000010   6F 64 69 6E 67 22 3A 20 22 63 70 38 35 30 22 0A  oding": "cp850".
00000020   7D                                               }

Ich gebe zu, die Darstellung ist unter aller sau, Danke WordPress, aber das Entscheidende ist zu sehen. Es sind die markierten 0A für den Zeilenumbruch. 0A weil es sich um eine Datei aus der Linuxwelt handelt, da ist 0A als Zeilenumbruch üblich. Hat sich leider bis zur Version 5.1 von Powershell nicht bei Microsoft herumgesprochen. Erst Powershell 6 Core arbeitet hier korrekt.

Wenn ich nun also vor dem Aufruf mit ConvertFrom-Json die Zeilenumbrüche in Windowsverträgliche umwandle, dann klappt auch die JSON-Konvertierung:

(Get-Content .\settings.json) -replace 0x10, (0x13,0x10) |ConvertFrom-Json

files.encoding
————–
cp850

Hier der Beweis, dass die anderen Zeilenumbrüche gesetzt sind:

PS > (Get-Content .\settings.json) -replace 0x10, (0x13,0x10) |out-string | Format-Hex

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   7B 0D 0A 20 20 20 20 22 66 69 6C 65 73 2E 65 6E  {..    "files.en
00000010   63 6F 64 69 6E 67 22 3A 20 22 63 70 38 35 30 22  coding": "cp850"
00000020   0D 0A 7D 0D 0A                                   ..}..

Da viele REST-APIs von Linuxrechnern auch JSON-Dateien verteilen und davon auszugehen ist, dass diese ihre JSON-Dateien mit den unter Linux-üblichen Zeilenumbrüchen versehen, ist davon auszugehen, dass das Problem auch bei einfachen Invoke-WebRequest zum Thema wird, wie hier https://stackoverflow.com/questions/24453320/invalid-json-primitive-error-when-converting-json-file oder hier https://stackoverflow.com/questions/47908382/convertfrom-json-invalid-json-primitive-%C3%AF.

Wie gesagt mit Powershell Core 6.x ist das Thema ebenfalls erledigt.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s


%d Bloggern gefällt das: