Herausforderungen von JSON Arrays in der Send Pipeline bei BizTalk | Sunato

Nils IhnkenBizTalk Academy, Integration mit BizTalk Server

JSON BizTalk Sunato

Bei der Umwandlung von XML-Nachrichten in JSON in BizTalk müssen wichtige Eckpunkte beachtet werden, damit eine saubere Konvertierung von BizTalk durchgeführt werden kann. Der folgende Artikel fasst die Herausforderungen beim Thema JSON-Array-Verarbeitung in BizTalk zusammen und stellt dar, was bei der Entwicklung und beim Benutzen einer XML zu JSON Send Pipeline zu beachten ist.

Arrays in JSON aus XML erzwingen

Zunächst zum Aufbau von XML und von JSON im Allgemeinen. XML ist so angelegt, dass ein Array von Knoten hintereinander mit derselben Bezeichnung versehen wird.

XML Input 1:

<zimmer>
   <zimmer>
      <name>Wohnzimmer</name>
   </zimmer>
   <zimmer>
      <name>Badezimmer</name>
   </zimmer>
   <zimmer>
      <name>Flur</name>
   </zimmer>
</zimmer>

In diesem Beispiel handelt es sich bei dem Array um die Aneinanderreihung der Knoten „zimmer“, wobei ein weiterer Knoten „zimmer“ einen übergeordneten Knoten für das Array bildet. Eine Umwandlung in JSON würde dann entsprechend wie folgt aussehen.

JSON Output 1:

{"zimmer":{
    [
      {"name":"Wohnzimmer"},
      {"name":"Badezimmer"},
      {"name":"Flur"}
    ]
  }
}

Wie zu erwarten, wird ein Array der einzelnen Knoten „zimmer“ angelegt. Die direkten Bezeichner der Knoten sind dabei verschwunden, sodass nur der Bezeichner „zimmer“ des übergeordneten Knotens verbleibt. In BizTalk wird die Umwandlung einer XML Nachricht in JSON durch den JSON Encoder als Teil einer Send Pipeline vorgenommen.
Angenommen, die XML Datei verfüge nur über einen Unterkonten anstatt drei, so ändert sich nun die Struktur wie folgt.

XML Input 2:

<zimmer>
  <zimmer>
     <name>Wohnzimmer</name>
  </zimmer>
</zimmer>

JSON Output 2:

{"zimmer":{
    {"name":"Wohnzimmer"},
  }
}

Da der Input aussieht, als gäbe es keine weiteren Zimmer-Knoten, wird bei der Umwandlung angenommen, es handle sich um ein einzelnes Element statt eines Arrays mit nur einem Element. Bei der Verarbeitung in einer BizTalk Send Pipeline kann es zu genau diesem Problem kommen, sobald die Input XML Nachricht über ein einelementiges Array verfügt. Bei der Weiterverarbeitung ist es meist umständlich, sowohl Arrays als auch einzelne Elemente als Eingabe zu akzeptieren. Besser wäre es, bei der Umwandlung in BizTalk immer ein Array zu erzwingen.

Dies lässt sich wie folgt realisieren:

Schritt 1: Beim Anlegen eines entsprechenden Schemas passend zu der Input XML Nachricht ist, wie in Schema 1 gezeigt, darauf zu achten, durchgängig mit minOccurs und maxOccurs die untere und obere Anzahl der Elemente anzugeben. Der JSON Encoder orientiert sich dabei an genau diesen Attributen um zu bestimmen, ob es sich um ein Array handelt oder nicht. Faustregel ist hierbei, sobald maxOccurs auf 1 gesetzt wird, wird ein Element erzeugt. Sobald maxOccurs auf unbounded gesetzt wird, wird immer ein Array erzeugt.

Schema 1:

BizTalk Schema XML to JSON

Schritt 2: Neben der Anpassung des Schemas muss auch eine Custom Pipeline angelegt werden.
JSON Encoding Pipeline BizTalk

Damit der JSON Encoder die Eigenschaften der XML Nachricht richtig verarbeiten kann, muss dem JSON Encoder ein XML Assembler vorgeschaltet sein. Würde nur ein JSON Encoder in der Pipeline verwendet werden, würden die minOccurs und maxOccurs Eigenschaften der Knoten nicht korrekt in JSON umgewandelt werden. Entsprechend kann es dann wieder zu einzelnen Elementen anstatt Arrays kommen.

Zusammenhängende Knoten/Unterknoten-Eigenschaften bei gleichem Bezeichner

Aus den oberen XML Input Nachrichten ergibt sich in BizTalk ein weiteres Problem. Da hier der übergeordnete Knoten „zimmer“ den gleichen Bezeichner verwendet wie die Unterknoten „zimmer“, kann es bei der Umwandlung von einelementigen Arrays von XML zu JSON in BizTalk zu Anomalien kommen.

JSON Output bei übergeordneten Knoten „zimmer“ maxOccurs=1:

{"zimmer":{
     {"name":"Wohnzimmer"},
  }
}

Der übergeordnete Knoten „zimmer“ vererbt seine Eigenschaften an den untergeordneten Knoten „zimmer“. Dies bedeutet: Sobald im übergeordneten Knoten „zimmer“ ein einzelnes Element sein soll (maxOccurs=1), wird auch der Unterknoten „zimmer“ – auch bei maxOccurs=unbounded Eigenschaft – zwangsläufig ein einzelnes Element. Andersherum verhält es sich ebenso. Hat der übergeordneten Knoten „zimmer“ eine maxOccurs=unbounded Eigenschaft, ist der untergeordnete Knoten „zimmer“ auch ein Array.

JSON Output bei übergeordneten Knoten „zimmer“ maxOccurs=unbounded:

{"zimmer":[
     [
        {"name":"Wohnzimmer"},
     ]
  ]
}

Die Lösung ist, für den unterordneten Knoten einen anderen Bezeichner einzuführen, um so die Knoten voneinander zu entkoppeln. So ist es nun wieder möglich, beiden separat die Eigenschaften zu geben.

Fazit

Resultierend aus den beiden Problemen sähe ein optimales Schema wie folgt aus.

Schema 2:
BizTalk Schema XML to JSON richtige Bezeichner
Neben den klar definierten minOccurs und maxOccurs Eigenschaften jedes Elements sind nun auch zwei unterschiedliche Bezeichner verwendet worden. Durch die Entkoppelung beider Knotenmengen können beide separat als Array oder einzelnes Element definiert werden. Eine Custom BizTalk Send Pipeline mit XML Assembler und JSON Encoder ist so in der Lage, das gewünschte Ergebnis zuverlässig zu liefern.

Custom Pipelines mit JSON Encoding sind eine elegante Lösung, um Ihr bestehendes BizTalk System mit Cutting Edge Cloud Services, wie den Azure Logic Apps, zu verbinden. Falls Sie mehr wissen wollen über Custom BizTalk Pipelines oder andere Fragen rund um BizTalk oder Azure Logic Apps haben, dann kommen Sie auf uns zu! Nils Ihnken, Developer Sunato GmbH Hamburg

Kontaktieren Sie den Autor...

... oder besuchen Sie uns in Hamburg. Zum Fachsimpeln, Besprechen von Projektvorhaben ... oder einfach nur zum Chillen auf unserer Dachterasse.

Kontaktieren Sie Nils Ihnken

Lassen Sie uns über Ihr Projekt sprechen!

Kontakt via Mail

Wer ist Sunato?


Wir liefern Ihre Daten aus – an Applikationen, Maschinen, Geräte und Benutzer. Mit anderen Worten: Wir organisieren die Logistik Ihrer Daten. Wenn unsere Kunden neue CRM oder ERP Systeme einführen, wenn sie neue Partner oder Kunden anbinden wollen oder neue Geräte verwenden wollen, dann haben sie oft die Anforderung, neue Applikationen mit ihrer existierenden IT Welt zu verbinden. Genau dabei unterstützen wir. Wir nutzen Technologien wie BizTalk Server und Azure Logic Apps, entwickeln Applikationen in .Net, schaffen HoloLens und Surface Hub Apps. Unsere Experten arbeiten von den Standorten Hamburg, München, Stuttgart aus.

Mehr über Sunato (english)