2016-07-08 18 views
1

Ich versuche derzeit herauszufinden, wie ich komplexe Dateneingabe in der WSO2 CEP behandeln könnte. Stellen wir uns vor ich eine Eingangsereignisdaten haben, die wie die unten:WSO2 CEP: Handle komplexe JSON-Objekte

{ 
    "item_id":456, 
    "user_id":42, 
    "documents":[ 
      { 
       "type":"word", 
       "name":"ordre de mission" 
      }, 
      { 
       "type":"excel", 
       "name":"horaires" 
      }, 
      { 
       "type":"pdf", 
       "name":"facture" 
      } 
     ] 
} 

Im Idealfall würde Ich mag diese in drei Veranstaltungen zur Explosion gebracht sehen, wie in der Anordnung unter:

[ 
    { 
     "item_id":456, 
     "user_id":42, 
     "type":"word", 
     "name":"ordre de mission" 
    }, 
    { 
     "item_id":456, 
     "user_id":42, 
     "type":"excel", 
     "name":"horaires" 
    }, 
    { 
     "item_id":456, 
     "user_id":42, 
     "type":"pdf", 
     "name":"facture" 
    } 
] 

Ich kann einfach nicht herausfinden, wie man so etwas kriegt ... Ich habe darüber nachgedacht, das "documents"-Array genauso zu reinjizieren, wie es ein separates Ereignis war, so dass das CEP das Array in 3 Stream-Elemente aufteilen würde. Aber selbst wenn ich das könnte, wären item_id und user_id im Prozess verloren ... Bis jetzt ist das einzige, was ich bekomme, das Dokumentfeld, das in meinen Strömen in eine serialisierte Zeichenfolge umgewandelt wird, so dass es sinnlos erscheint die darin enthaltenen Daten abrufen ...

Das Beispiel, das ich hier zeige, ist ziemlich einfach gegen andere Dinge, die ich verwalten müsste, mit gekapselten Objekten und Array in mehreren Schichten. Wenn mir also jemand eine allgemeine Anweisung geben könnte, wie man mit Arrays und Objekten umgeht, wenn diese nicht die Wurzel der Event-Daten sind oder sogar übereinander gelegt werden, würde es mir wirklich helfen!

+0

Werfen Sie einen Blick auf diesen Link: https://docs.wso2.com/display/CEP410/Input+Mapping+Types#InputMappingTypes-JSONinputmappingJSONInputMapping – CapturedTree

Antwort

0

können Sie die Siddhi-Kartenerweiterung verwenden, um diese untergeordneten Elemente zu extrahieren [1]. Im Ausführungsplan können Sie die map: createFromJSON (Dokumente) -Funktion (entsprechend dem Ihrem Stream entsprechenden Attribut Dokumente) der Kartenerweiterung verwenden, um eine Karte zu erstellen. Dann extrahiere entsprechende Werte aus ihren Schlüsseln. (Wort, Excel usw.) Bitte beachten Sie [1]. Wenn Sie drei Ereignisse aus dem obigen Stream ausgeben möchten, müssen Sie einen benutzerdefinierten StreamProcessor schreiben. Bitte beachten Sie [2].

[1] https://docs.wso2.com/display/CEP410/Siddhi+Extensions#SiddhiExtensions-map

[2] https://docs.wso2.com/display/CEP410/Writing+a+Custom+Stream+Processor+Extension

+0

Hallo dnWick, danke für Ihre Antworten. Obwohl ich nicht sehen kann, wie irgendetwas in Siddhi mein Problem lösen könnte ... In meinem Empfänger habe ich ein Array: das JSON-Feld "Dokumente". Zwischen dem Empfänger und einem beliebigen Ausführungsplan (siddhi) muss ich einen Stream verwenden, und mein Kernproblem ist genau das: Wie kann ich Arrays und JSON-Objekte in meinen Stream einfügen, da Stream-Felder nur von Basistypen sein können (int , Bool, String, etc.)? – Vinny

+0

Vinny, können Sie dieses Problem lösen? –

+0

Vinny, können Sie dieses Problem lösen? –

0

Wenn wir die Dinge in einer allgemeinere Art und Weise betrachten, ich frage mich, wie JSON-Daten zu handhaben, da es keinen Objekttyp ist, weder Arrays im Strom ... Attribute

Vielleicht hier mein Problem ist wirklich breiter als es in meiner Frage erscheinen ...

das Ding ist, ich Simpl nicht verstehen, wie komplexe JSON Eingangsdaten sie richtige Art und Weise zu handhaben .. Ich kann nicht fin d irgendetwas in der WSO2 Dokumentation oder anderswo ...

Bitte lassen Sie mich wissen, wenn ich falsch liege, aber die Art, wie ich die Dinge sehe, wenn ich mit einem JSON-Eingabedaten wie der unten behandeln musste, es wäre ohne ernsthafte Haken und hässlich Abhilfen wirklich schwer oder sogar unmöglich sein ..

{ "Referenz": "tiers1", "emailRecipient": { "auf": [ "[email protected] „], "Durchschlag": [], "blindCarbonCopy"[] } }

In Wie kann ich zum Beispiel in meinem Stream den Inhalt der Arrays "to" und "carbonCopy" speichern? Wenn ich String-Attribute verwende, werden die Arrays in den Attributen serialisiert. Dies ist praktisch möglich, aber wenn diese Attribute in einem Herausgeber geschrieben werden und als Zeichenfolgen betrachtet werden, fügt die CEP einige Anführungszeichen hinzu, wenn beispielsweise JSON angegeben wird. Und das ist nur einer der Aspekte vieler Probleme ...

Also, meine Frage nach allem, ist das WSO2 CEP sogar entworfen, um solche komplexen JSON-Daten zu verwalten? Weil ich wirklich denke, dass es nicht ist ...