{"id":556,"date":"2017-12-30T22:40:37","date_gmt":"2017-12-30T21:40:37","guid":{"rendered":"http:\/\/www.steffen-liersch.de\/content\/de\/?p=556"},"modified":"2025-03-02T11:29:43","modified_gmt":"2025-03-02T10:29:43","slug":"json-support-for-net","status":"publish","type":"post","link":"https:\/\/www.steffen-liersch.de\/content\/de\/2017\/12\/json-support-for-net\/","title":{"rendered":"Liersch.Json &#8211; JSON-Unterst\u00fctzung f\u00fcr .NET"},"content":{"rendered":"<p><code>Liersch.Json<\/code> ist eine kompakte .NET-Bibliothek zum Parsen und Erzeugen von <a href=\"https:\/\/de.wikipedia.org\/wiki\/JavaScript_Object_Notation\">JSON<\/a>-Dokumenten. Die Implementierung basiert auf C# 3.0 und ist f\u00fcr folgende .NET-Plattformen geeignet:<\/p>\n<ul>\n<li>ab .NET Framework 2.0<\/li>\n<li>ab .NET Core 1.0<\/li>\n<li>ab .NET Standard 1.0<\/li>\n<li>Mono<\/li>\n<li>.NET Micro Framework 4.4<\/li>\n<\/ul>\n<p>Die kompilierte Bibliothek hat eine Gr\u00f6\u00dfe von lediglich \u224825 kB. Alle nennenswerten Bibliotheks\u00e4nderungen werden in der Datei <a href=\"https:\/\/github.com\/steffen-liersch\/Liersch.Json\/blob\/master\/CHANGELOG.md\">CHANGELOG.md<\/a> protokolliert.<\/p>\n<h2>Verwendung der Bibliothek<\/h2>\n<p><code>Liersch.Json<\/code> ist auf <a href=\"https:\/\/www.nuget.org\/packages\/Liersch.Json\">NuGet<\/a> verf\u00fcgbar und kann \u00fcber diesen Wege sehr komfortabel in neue oder bestehende Projekte integriert werden. F\u00fcr \u00e4ltere Projekte (vor .NET Framework 4.0) muss die Bibliothek manuell kompiliert und integriert werden. Mit Hilfe des Compilersymbols <code>NETMF<\/code> kann der Quellcode auch f\u00fcr das veraltete .NET Micro Framework \u00fcbersetzt werden.<\/p>\n<h2>Migration von Version 1.x<\/h2>\n<ul>\n<li>Das in Version 1.x verwendete Typpr\u00e4fix <code>SL<\/code> entf\u00e4llt in Version 2.x.<\/li>\n<li>Die auf Reflection basierenden Klassen wurden in die neue Bibliothek <a href=\"https:\/\/github.com\/steffen-liersch\/Liersch.JsonSerialization\">Liersch.JsonSerialization<\/a> ausgelagert.<\/li>\n<\/ul>\n<h2>Parsen von JSON-Dokumenten<\/h2>\n<p>Die statische Funktion <code>JsonNode.Parse<\/code> sollte f\u00fcr das Parsen von JSON-Dokumenten verwendet werden. Dabei wird gleichzeitig die Syntax des JSON-Dokuments \u00fcberpr\u00fcft. Liegt eine Syntaxverletzung vor, wird die Ausnahme vom Typ <code>JsonException<\/code> generiert.<\/p>\n<p>Alternativ kann eine Instanz der Klasse <code>JsonParser<\/code> erstellt werden. Verschiedene Eigenschaften dienen zur Festlegung der Arbeitsweise. Beispielsweise unterst\u00fctzt <code>JsonParser<\/code> optional einfache Anf\u00fchrungszeichen.<\/p>\n<pre><code class=\"language-cs\">public static void RunExample1()\n{\n  string json=@&quot;\n  {\n    &quot;&quot;addressBook&quot;&quot;: [\n      {&quot;&quot;lastName&quot;&quot;: &quot;&quot;Average&quot;&quot;, &quot;&quot;firstName&quot;&quot;: &quot;&quot;Joe&quot;&quot;},\n      {&quot;&quot;lastName&quot;&quot;: &quot;&quot;Doe&quot;&quot;, &quot;&quot;firstName&quot;&quot;: &quot;&quot;Jane&quot;&quot;},\n      {&quot;&quot;lastName&quot;&quot;: &quot;&quot;Smith&quot;&quot;, &quot;&quot;firstName&quot;&quot;: &quot;&quot;John&quot;&quot;}\n    ]\n  }&quot;;\n\n  var root=JsonNode.Parse(json);\n  JsonNode book=root[&quot;addressBook&quot;];\n  if(book.IsArray)\n  {\n    int c=book.Count;\n    for(int i=0; i&lt;c; i++)\n    {\n      JsonNode entry=book[i];\n      string ln=entry[&quot;lastName&quot;];\n      string fn=entry[&quot;firstName&quot;];\n      Console.WriteLine(fn+&quot; &quot;+ln);\n    }\n  }\n}<\/code><\/pre>\n<h2>Die Klasse JsonNode<\/h2>\n<p><code>JsonNode<\/code> 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. <code>JsonNode<\/code> implementiert <code>IEnumerable<\/code>, um die Werte eines Arrays oder Objekts zu liefern. Die Eigenschaft <code>Names<\/code> liefert f\u00fcr Objekte die Namen aller Eigenschaften.<\/p>\n<pre><code class=\"language-cs\">public static void RunExample2()\n{\n  string json=RetrieveJsonExample();\n  PrintNode(JsonNode.Parse(json), &quot;demo = &quot;, 0);\n}\n\nstatic void PrintNode(JsonNode node, string prefix, int level)\n{\n  Console.Write(new string(&#039; &#039;, level*2));\n  Console.Write(prefix);\n\n  switch(node.NodeType)\n  {\n    case JsonNodeType.Array:\n      Console.WriteLine(&quot;(Array)&quot;);\n      int c=node.Count;\n      for(int i=0; i&lt;c; i++)\n        PrintNode(node[i], &quot;[&quot;+i.ToString(CultureInfo.InvariantCulture)+&quot;] = &quot;, level+1);\n      break;\n\n    case JsonNodeType.Object:\n      Console.WriteLine(&quot;(Object)&quot;);\n      foreach(string name in node.Names)\n        PrintNode(node[name], name+&quot; = &quot;, level+1);\n      break;\n\n    case JsonNodeType.Boolean:\n    case JsonNodeType.Number:\n    case JsonNodeType.String:\n      Console.WriteLine(node.AsString+&quot; (&quot;+node.NodeType.ToString()+&quot;)&quot;);\n      break;\n\n    default:\n      Console.WriteLine(&quot;(&quot;+node.NodeType.ToString()+&quot;)&quot;);\n      break;\n  }\n}<\/code><\/pre>\n<p>Zum Lesen und Schreiben von Werten stehen die Eigenschaften <code>AsBoolean<\/code>, <code>AsInt32<\/code>, <code>AsInt64<\/code>, <code>AsDouble<\/code> und <code>AsString<\/code> zur Verf\u00fcgung. Wenn ein Wert beim Lesen nicht in den jeweiligen Datentyp konvertiert werden kann, wird stattdessen der Standardwert, also <code>0<\/code> oder <code>null<\/code> zur\u00fcckgegeben.<\/p>\n<p>Das Lesen eines nicht vorhandenen Wertes oder der Zugriff \u00fcber einen nicht vorhandenen Index liefert eine leere Instanz von <code>JsonNode<\/code> zur\u00fcck. Schreibzugriffe auf nicht vorhandene Werte f\u00fchren dazu, dass diese erzeugt werden. <code>JsonNode<\/code> kann auf diese Weise genutzt werden, um neue JSON-Dokumente zu generieren.<\/p>\n<pre><code class=\"language-cs\">public static void RunExample3()\n{\n  var root=new JsonNode();\n  root[&quot;addressBook&quot;]=CreateAddressBook();\n  Console.WriteLine(root.AsJson);\n}\n\nstatic JsonNode CreateAddressBook()\n{\n  var book=new JsonNode();\n\n  book[0][&quot;LastName&quot;]=&quot;Average&quot;;\n  book[0][&quot;firstName&quot;]=&quot;Joe&quot;;\n\n  book[1][&quot;LastName&quot;]=&quot;Doe&quot;;\n  book[1][&quot;firstName&quot;]=&quot;Jane&quot;;\n\n  book[2][&quot;LastName&quot;]=&quot;Smith&quot;;\n  book[2][&quot;firstName&quot;]=&quot;John&quot;;\n\n  return book;\n}<\/code><\/pre>\n<h2>Die Klasse JsonMonitor<\/h2>\n<p><code>JsonNode.CreateMonitor<\/code> erzeugt eine neue Instanz von <code>JsonMonitor<\/code>. Ein solcher Aufruf ist nur f\u00fcr Wurzelelemente und nur ein einziges Mal erlaubt.<\/p>\n<p><code>JsonMonitor.IsModified<\/code> zeigt mit <code>true<\/code> an, wenn ein untergeordneter Knoten oder der Wurzelknoten selbst ge\u00e4ndert wurde. <code>JsonMonitor.IsReadOnly<\/code> dient dazu, \u00c4nderungen zu unterbinden. Werden Knoten an externen Code \u00fcbergeben, kann diese Eigenschaft genutzt werden, um unerw\u00fcnschte Seiteneffekte zu verhindern.<\/p>\n<h2>Die Klasse JsonWriter<\/h2>\n<p><code>JsonWriter<\/code> dient zum Erzeugen von JSON-Dokumenten. Die Klasse ist minimalistisch implementiert. Sie verf\u00fcgt \u00fcber keine Pr\u00fcfungen und arbeitet dadurch sehr effizienzt.<\/p>\n<h2>Lizenz<\/h2>\n<p>Die Ver\u00f6ffentlichung der Software erfolgt unter den Bedingungen einer Open-Source-Lizenz. Alternativ k\u00f6nnen im Rahmen einer kommerziellen Lizenz andere Bedingungen vereinbart werden. Sie k\u00f6nnen Pflege und Weiterentwicklung der Software mit einer <a href=\"https:\/\/www.paypal.com\/cgi-bin\/webscr?cmd=_s-xclick&amp;hosted_button_id=NVXEQCNGJFK92\">freiwilligen Spende<\/a> unterst\u00fctzen.<\/p>\n<h2>Copyright<\/h2>\n<p>Copyright \u00a9 2013-2023 Steffen Liersch<br \/>\n<a href=\"https:\/\/www.steffen-liersch.de\/\">https:\/\/www.steffen-liersch.de\/<\/a><\/p>\n<h2>Verweise<\/h2>\n<p>Der Quellcode wird auf GitHub gepflegt:<br \/>\n<a href=\"https:\/\/github.com\/steffen-liersch\/Liersch.Json\">https:\/\/github.com\/steffen-liersch\/Liersch.Json<\/a><\/p>\n<p>Pakete k\u00f6nnen \u00fcber NuGet heruntergeladen werden:<br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/Liersch.Json\">https:\/\/www.nuget.org\/packages\/Liersch.Json<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Liersch.Json ist eine kompakte .NET-Bibliothek zum Parsen und Erzeugen von JSON-Dokumenten. Die Implementierung basiert auf C# 3.0 und ist f\u00fcr viele .NET-Plattformen geeignet.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[21,25,34,36,31],"class_list":["post-556","post","type-post","status-publish","format-standard","hentry","category-net","tag-net","tag-cs","tag-json","tag-open-source","tag-products"],"_links":{"self":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/comments?post=556"}],"version-history":[{"count":49,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/556\/revisions"}],"predecessor-version":[{"id":953,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/556\/revisions\/953"}],"wp:attachment":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/media?parent=556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/categories?post=556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/tags?post=556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}