Veröffentlicht am 21-02-2019

Arbeiten Sie mit JSON, stoppen Sie die Serialisierung!

Eingängiger Titel? Ja… hatte keine andere Idee :)

Bei der Arbeit mit API dreht sich heutzutage alles um JSON. Wie alle diese SAAS-Produkte sprechen auch große Plattformen wie Microsoft oder Google Rest und JSON. Wenn Sie jedoch mit APIs arbeiten, finden Sie viel Code in C # oder GO oder PHP oder was sonst noch sonderbar ist, wenn Sie daran denken. Um in der Lage zu sein, JSON-Nutzdaten in C # zu generieren, würden wir eine Menge neuer Objekte generieren, diese mit Daten füllen, um sie am Ende zu serialisieren, und wahrscheinlich haben sie Müll gesammelt.

Ich habe bei der Arbeit an einem neuen Service Integrationen bei Teamwork.com geschrieben, dachte ich

„Warum C # - oder Go-Code schreiben, um ihn später zu (de) serialisieren, wenn wir dies direkt in JSON tun können?“

Und das stimmt wirklich. Lassen Sie mich am Beispiel unserer jüngsten Arbeiten zu MS-Teams und adaptiven Karten zeigen, worüber ich spreche:

Sie finden dies wahrscheinlich sehr viel im Quellcode auf der ganzen Welt

In unserem Beispiel senden wir das Status-Update einer Person an MS-Teams, und wir verwenden dafür Adaptive Cards. Das dafür benötigte JSON-Schema ist ziemlich komplex, wenn Sie schöne Karten erstellen möchten. Der „alte“ aktuelle Ansatz besteht darin, dass Sie mehrere Objekte mit Elementauflistungen und einigen Textfeldern erstellen, die mit tatsächlichen Daten aus Ihrem Objekt gefüllt sind.

Der Ansatz für C #, der aus verschiedenen Mustern und Anleitungen für unsere Karte stammt, würde wahrscheinlich folgendermaßen aussehen:

Dies ist so ziemlich das, was Sie heutzutage in einer Vielzahl von Repositories finden, die mit adaptiven Karten arbeiten. Entweder in C # oder einer anderen objektorientierten Sprache. Es ist fast immer dasselbe. Tonnenweise neue Objekte erstellt, Tonnen Codezeilen, um am Ende alles nach unten zu serialisieren. All das nutzt Speicher, Leistung und ist darüber hinaus nicht wirklich zu warten. Während ich daran arbeitete, suchte ich nach einer besseren Lösung, da mich das alles sehr ärgerte. Und weißt du was, ich habe einen gefunden!

Verwenden von Rasiervorlagen zum Arbeiten mit JSON

Das ist so ziemlich das, was Sie jetzt oft in unserem Code finden:

Wir haben einen so genannten „Karten-Rendering-Dienst“, der die gesamte Arbeit erledigt, um das für die adaptive Karte benötigte JSON-Schema zu erstellen, und es mit tatsächlichen Daten füllt pflegen als der alte, auf Klasse / Objekt / Serialisierung basierende Ansatz.

Die Implementierung der Kartenwiedergabe ist (dank RazorLight) wirklich einfach:

Lassen Sie uns jetzt ein wenig tiefer graben. Der Aufruf an unseren Service erwartet _cardservice.RenderCard (templateKey, template, data); hat 3 Parameter und funktioniert wie gewohnt, wenn Sie die von Todd Adams erstellte Bibliothek verwenden. Mit einem deutlichen Unterschied. Die Bibliothek wurde für Razor-HTML-Vorlagen geschrieben ... Wir reden hier nicht einmal fern!

Was wir eigentlich an RazorLight übergeben, ist folgendes:

templateKey -> normalerweise das letzteChangeDate unserer Vorlagendatei als ddMMYYmmss. RazorLight speichert Vorlagen auf Grundlage des Schlüssels zwischen, so lange die Datei ihren Cache nicht ändert und wenn die Datei geändert wird, wird der Cache aktualisiert. Einfach.

template -> unsere aktuelle JSON-Vorlage, mehr dazu unten

data -> aktuelles Objekt mit Daten, die wir rendern möchten, in unserem Beispiel ist dies das Statusobjekt, das die Statusaktualisierung und die Personeninformationen enthält.

Basierend darauf sieht unsere vollständige Implementierung der aktuellen Adaptive Card jetzt so aus:

Wie Sie sehen, verwenden wir die JSON-Vorlage wie eine normale HTML-Vorlage. Wir können alles tun, was wir möglicherweise in Rasierklingen nur in JSON tun können. Wenn Sie mehr Komplexität brauchen, ist das kein Problem.

Fazit

Die Arbeit mit solchen Drittanbieter-APIs und vor allem mit komplexeren Schemata, wie sie für AdaptiveCards erforderlich sind, macht die Sache viel mehr Spaß und eröffnet eine Menge möglicher Dinge, die Sie tun können. Wir können den Builder für AdaptiveCard verwenden und einfach den Code 1: 1 kopieren und einfügen, ohne dass Änderungen erforderlich sind. Dies verkürzt die Entwicklungszeit erheblich! Außerdem müssen Sie normalerweise den Code erneut anpassen, wenn Sie eine Payload ändern möchten oder wenn Sie das Layout Ihrer AdaptiveCard oder nahezu alle JSON-Payloads ändern möchten, die Sie gesendet haben Daten zu Github haben es gebaut und das alles. Dauert eine Weile, nicht leicht und bei weitem einfach. Was wir mit unserer Implementierung erreichen können, ist viel flexibler. Wir können unsere Vorlagen als Dateien speichern, aber die JSON-Vorlagen können auch aus einer Datenbank geladen werden. (Wir speichern unsere Payloads tatsächlich in der Datenbank, sodass wir unsere Adaptive Cards im Handumdrehen ändern können, ohne dass eine erneute Kompilierung erforderlich ist!). Wenn Sie diese Option mit in der Datenbank gespeicherten Vorlagen kombinieren, können Sie Ihre Payloads problemlos ändern und das Aussehen einer Adaptive Card ändern und müssen nichts umgebaut werden. Aktualisieren Sie einfach die Vorlage oder die Datei nach Ihren Wünschen.

Auf der technischen Seite der Dinge haben Sie viel weniger Objekte erstellt, die Garbage Collection ist weniger ausgelastet und es werden keine Tonnen von Klassen mehr serialisiert.

Die API spricht JSON…. Das Arbeiten mit JSON macht die Sache plötzlich viel einfacher

Lass mich wissen, was du denkst, würde gerne Feedback hören!

Siehe auch

Wie sehr interessieren sich die Verbraucher für personalisierte Waren?Die Anatomie einer intelligenten StadtBranchenübergreifende Zusammenarbeit zur Erreichung der außenpolitischen Prioritäten der USASequenz 1.3 VorankündigungSeht die Ides vom MärzEin neues Gerät spricht die Sprache des Gehirns, um die motorischen Fähigkeiten zu optimieren