Das JavaScript Object Notation-Format, kurz JSON, kommt immer mehr in Mode, da Webservice-Aufrufe auch im Admin-Alltag eine Rolle spielen.
Das folgende Beispiel ist aus der Notwendigkeit entstanden, den Inhalt einer JSON-Datei, die in einem Webverzeichnis liegt, verarbeiten zu müssen. Mehr oder weniger ad-hoc.
Die URL der Datei ist http://www.activetraining.de/Nanohub/Kurs1001.json.
Das Herunterladen erledigt Curl:
1 |
curl http://www.activetraining.de/Nanohub/Kurs1001.json |
Hinter Curl steckt natürlich nicht das vielseitige Allround-Kommandozeilentool, sondern lediglich das Invoke-WebRequest-Cmdlet. Die Rückgabe ist daher nicht Text, sondern ein WebResponseObject-Objekt. Der heruntergeladene Inhalt steckt in der Content-Property, aber als Byte-Folge.
Gesucht ist daher eine „Trick“, um aus der Byte-Folge Text zu machen. Wer sich ein wenig mit .NET auskennt weiß, dass es dafür die Encoding-Klasse gibt, die verschiedene „Encoder“ über statische Properties zur Verfügung stellt. Eine gute Wahl ist immer der Default-Encoder. Ein wenig ungewöhnlich ist (jedenfalls für mich;), dass jede statische Encoder-Eigenschaft für ein Objekt steht. Unter anderem bietet jedes Objekt eine GetText-Methode, die eine Byte-Folge in einen Text umwandelt.
Der folgende Aufruf macht aus einer Byte-Folge daher Text:
1 |
[System.Text.Encoding]::Default.GetString($Bytes) |
Das Ganze soll allerdings in eine Function eingebaut werden, so dass sich der Byte-Inhalt direkt nach dem Aufruf von Curl in Text umwandeln lässt.
Auftritt PowerShell-Konsole und dem genialen PSReadLine-Modul, das ab Windows Server 2016 und Windows 10 bekanntlich fest dabei ist und ansonsten per Install-Module PSReadline -Force nachgeladen wird. Dank PSReadline ist es kein Problem, eine komplette Function-Definition in die Konsole einzugeben:
1 2 3 4 5 6 7 |
function ConvertFrom-Curl { param([Parameter(ValueFromPipeline=$true)][Byte]$InputObject) begin { $Bytes = @() } process { $Bytes += $_ } end { [System.Text.Encoding]::Default.GetString($Bytes) } } |
Das Beste daran ist, dass die komplette Function-Definition komfortabel editieren kann. Einfach per [Pfeil oben]-Taste und den üblichen Tasten für die Textbearbeitung. Einfach und genial.
Die Umwandlung des heruntergeladenen JSON in Objekte sieht damit wie folgt aus:
1 |
curl http://www.activetraining.de/Nanohub/Kurs1001.json | Select -ExpandProperty Content | convertFrom-Curl |