Liersch.Json – JSON-Unterstützung für .NET

Liersch.Json ist eine kompakte .NET-Bibliothek zum Parsen und Erzeugen von JSON-Dokumenten. Die Implementierung basiert auf C# 3.0 und ist für folgende .NET-Plattformen geeignet:

  • ab .NET Framework 2.0
  • ab .NET Core 1.0
  • ab .NET Standard 1.0
  • Mono
  • .NET Micro Framework 4.4

Die kompilierte Bibliothek hat eine Größe von lediglich ≈25 kB. Alle nennenswerten Bibliotheksänderungen werden in der Datei CHANGELOG.md protokolliert.

Verwendung der Bibliothek

Liersch.Json ist auf NuGet verfügbar und kann über diesen Wege sehr komfortabel in neue oder bestehende Projekte integriert werden. Für ältere Projekte (vor .NET Framework 4.0) muss die Bibliothek manuell kompiliert und integriert werden. Mit Hilfe des Compilersymbols NETMF kann der Quellcode auch für das veraltete .NET Micro Framework übersetzt werden.

Migration von Version 1.x

  • Das in Version 1.x verwendete Typpräfix SL entfällt in Version 2.x.
  • Die auf Reflection basierenden Klassen wurden in die neue Bibliothek Liersch.JsonSerialization ausgelagert.

Parsen von JSON-Dokumenten

Die statische Funktion JsonNode.Parse sollte für das Parsen von JSON-Dokumenten verwendet werden. Dabei wird gleichzeitig die Syntax des JSON-Dokuments überprüft. Liegt eine Syntaxverletzung vor, wird die Ausnahme vom Typ JsonException generiert.

Alternativ kann eine Instanz der Klasse JsonParser erstellt werden. Verschiedene Eigenschaften dienen zur Festlegung der Arbeitsweise. Beispielsweise unterstützt JsonParser optional einfache Anführungszeichen.

public static void RunExample1()
{
  string json=@"
  {
    ""addressBook"": [
      {""lastName"": ""Average"", ""firstName"": ""Joe""},
      {""lastName"": ""Doe"", ""firstName"": ""Jane""},
      {""lastName"": ""Smith"", ""firstName"": ""John""}
    ]
  }";

  var root=JsonNode.Parse(json);
  JsonNode book=root["addressBook"];
  if(book.IsArray)
  {
    int c=book.Count;
    for(int i=0; i<c; i++)
    {
      JsonNode entry=book[i];
      string ln=entry["lastName"];
      string fn=entry["firstName"];
      Console.WriteLine(fn+" "+ln);
    }
  }
}

Die Klasse JsonNode

JsonNode ist die zentrale Klasse zum Speichern eines JSON-Dokuments. Sie bietet zahlreiche Funktionen und Eigenschaften zur Analyse und Bearbeitung. Operatoren erleichtern den lesenden und schreibenden Zugriff auf Werte. JsonNode implementiert IEnumerable, um die Werte eines Arrays oder Objekts zu liefern. Die Eigenschaft Names liefert für Objekte die Namen aller Eigenschaften.

public static void RunExample2()
{
  string json=RetrieveJsonExample();
  PrintNode(JsonNode.Parse(json), "demo = ", 0);
}

static void PrintNode(JsonNode node, string prefix, int level)
{
  Console.Write(new string(' ', level*2));
  Console.Write(prefix);

  switch(node.NodeType)
  {
    case JsonNodeType.Array:
      Console.WriteLine("(Array)");
      int c=node.Count;
      for(int i=0; i<c; i++)
        PrintNode(node[i], "["+i.ToString(CultureInfo.InvariantCulture)+"] = ", level+1);
      break;

    case JsonNodeType.Object:
      Console.WriteLine("(Object)");
      foreach(string name in node.Names)
        PrintNode(node[name], name+" = ", level+1);
      break;

    case JsonNodeType.Boolean:
    case JsonNodeType.Number:
    case JsonNodeType.String:
      Console.WriteLine(node.AsString+" ("+node.NodeType.ToString()+")");
      break;

    default:
      Console.WriteLine("("+node.NodeType.ToString()+")");
      break;
  }
}

Zum Lesen und Schreiben von Werten stehen die Eigenschaften AsBoolean, AsInt32, AsInt64, AsDouble und AsString zur Verfügung. Wenn ein Wert beim Lesen nicht in den jeweiligen Datentyp konvertiert werden kann, wird stattdessen der Standardwert, also 0 oder null zurückgegeben.

Das Lesen eines nicht vorhandenen Wertes oder der Zugriff über einen nicht vorhandenen Index liefert eine leere Instanz von JsonNode zurück. Schreibzugriffe auf nicht vorhandene Werte führen dazu, dass diese erzeugt werden. JsonNode kann auf diese Weise genutzt werden, um neue JSON-Dokumente zu generieren.

public static void RunExample3()
{
  var root=new JsonNode();
  root["addressBook"]=CreateAddressBook();
  Console.WriteLine(root.AsJson);
}

static JsonNode CreateAddressBook()
{
  var book=new JsonNode();

  book[0]["LastName"]="Average";
  book[0]["firstName"]="Joe";

  book[1]["LastName"]="Doe";
  book[1]["firstName"]="Jane";

  book[2]["LastName"]="Smith";
  book[2]["firstName"]="John";

  return book;
}

Die Klasse JsonMonitor

JsonNode.CreateMonitor erzeugt eine neue Instanz von JsonMonitor. Ein solcher Aufruf ist nur für Wurzelelemente und nur ein einziges Mal erlaubt.

JsonMonitor.IsModified zeigt mit true an, wenn ein untergeordneter Knoten oder der Wurzelknoten selbst geändert wurde. JsonMonitor.IsReadOnly dient dazu, Änderungen zu unterbinden. Werden Knoten an externen Code übergeben, kann diese Eigenschaft genutzt werden, um unerwünschte Seiteneffekte zu verhindern.

Die Klasse JsonWriter

JsonWriter dient zum Erzeugen von JSON-Dokumenten. Die Klasse ist minimalistisch implementiert. Sie verfügt über keine Prüfungen und arbeitet dadurch sehr effizienzt.

Lizenz

Die Veröffentlichung der Software erfolgt unter den Bedingungen einer Open-Source-Lizenz. Alternativ können im Rahmen einer kommerziellen Lizenz andere Bedingungen vereinbart werden. Sie können Pflege und Weiterentwicklung der Software mit einer freiwilligen Spende unterstützen.

Copyright

Copyright © 2013-2023 Steffen Liersch
https://www.steffen-liersch.de/

Verweise

Der Quellcode wird auf GitHub gepflegt:
https://github.com/steffen-liersch/Liersch.Json

Pakete können über NuGet heruntergeladen werden:
https://www.nuget.org/packages/Liersch.Json

Ähnliche Artikel

Schreiben Sie einen Kommentar