AL Wrapper-Funktionen zur JSON-Verarbeitung

Use code to clean code – Wrapper-Funktionen

Daniel Gorski
Daniel Gorski 20. Februar 2022
2 Min. Lesezeit

Unser nächstes AL-Go Template und den ganzen Quellcode findet ihr hier: https://github.com/byndit/BeyondAL

Dort ist auch ein Wrapper für Web Requests und Control Addins zu finden!

Viele neue Funktionalitäten in AL helfen uns vormals komplexe Probleme (bspw. das Parsen von JSON oder XML) einfacher umzusetzen. Dennoch kann solcher Quellcode noch immer unnötig komplex oder lang werden.

Am Beispiel des Parsens eines JSON Objekts möchten wir illustrieren, wie Code effektiv reduziert werden kann, indem Wrapper-Funktionen geschrieben werden.

Folgendes JSON soll als Beispiel dienen:

{
	"id": "7eba17ec-399e-4be8-b7a4-1aceeb155b5f",
	"name": "Max Mustermann",
	"address": "Musterstraße 1",
	"postCode": "12345",
	"city": "Musterstadt",
	"attributes": {
		"transfer": true,
		"homepage": "https://www.mustermann.de"
	},
	"shippingAddresses": [
		{
			"name": "Max Mustermann",
			"address": "Musterstraße 116",
			"postCode": "67891",
			"city": "Musterdorf"
		},
		{
			"name": "Maxi Musterfrau",
			"address": "Musterstraße 202",
			"postCode": "41342",
			"city": "Musterstadt"
		}
	]
}

Der AL Code soll nun alle Werte aus diesem JSON Objekt auslesen und einen Debitor mit den zugehörigen Liefer-an Adressen erstellen.

Ohne Wrapper-Funktionen könnte der Quellcode in etwa so aussehen:

Mit Wrapper-Funktionen kann der obenstehende Quellcode wie folgt verkürzt werden:

Dabei stellt die Codeunit „BYD Json Helper“ kleine Helferfunktionen bereit, die die bestehenden Funktionen von JsonObject, JsonArray, JsonToken und JsonValue geschickt verpacken und einfacher nutzbar machen:

procedure FindValue(JObject: JsonObject; Path: Text): JsonValue
var
   JToken: JsonToken;
begin
   if JObject.SelectToken(Path, JToken) then
      if JToken.IsValue() then
         exit(JToken.AsValue());
   Error(UnableToFindJsonValueErr, Path);
end;

procedure ValAsTxt(JObject: JsonObject; Path: Text): Text
begin
   exit(FindValue(JObject, Path).AsText());
end;

procedure ValAsBool(JObject: JsonObject; Path: Text): Boolean
begin
   exit(FindValue(JObject, Path).AsBoolean());
end;

procedure ReadJArrayFromObj(JObject: JsonObject; Path: Text): JsonArray
var
   JToken: JsonToken;
begin
   if JObject.SelectToken(Path, JToken) then
      if JToken.IsArray() then
         exit(JToken.AsArray());
end;

Wir machen uns hier die „SelectToken“ Funktion zu Nutze, um sowohl mit Eigenschaftennamen als auch mit Pfaden zu arbeiten bzw. Werte aus der JSON Struktur zu lesen.

Dadurch sind wir in der Lage den ursprünglichen Quellcode deutlich zu verkürzen, verständlicher zu schreiben und Variablendeklarationen zu sparen.

Da diese Funktionen in einer dedizierten Codeunit ausgelagert sind, können diese immer und immer wieder an verschiedenen Stellen der Anwendung genutzt werden!

Den ganzen Quellcode gibt's hier: https://github.com/byndit/BeyondAL

how-to
entwicklung
al code
wrapper
json
business central
code quality
Visualisierung von Hauptbuch und Nebenbuch in Business Central

Hauptbuch und Nebenbuch in Business Central: So hängt alles zusammen

Hauptbuch, Nebenbuch, Buchungsgruppen – klingt trocken, ist aber das Fundament jeder sauberen Buchhaltung in Business Central. Wer hier nicht durchblickt, verli

Weiter lesen
Weiter lesen
Modulare ERP-Architektur für skalierbare Unternehmenssoftware

Warum ERP erst dann wirklich skalierbar wird, wenn es modular gedacht wird

ERP-Systeme gelten als stabiles Rückgrat moderner Unternehmen. Doch die Realität zeigt: hohe Komplexität, starre Strukturen und teure Anpassungen. Die Lösung? M

Weiter lesen
Weiter lesen