Neues Thema starten

autoExpand asRows ohne Array

Hallo Zusammen,


ich bekomme aus einem Call folgendes JSON zurück.

     

{
 "data":{
  "purchaseOrders":{ 
   "shipment_1":{"id":"136333","handle":"A54E4B01-1BBA-4F43-9842-36F4D0ED58D6","status":"NEW","submittedAt":"2020-08-18 15:05:49.8371 +00:00","completedAt":null,"errors":[]
   },
   "shipment_2":{"id":"136334","handle":"CEC637D5-AA91-4C2B-9496-67C7C60D9596","status":"NEW","submittedAt":"2020-08-18 15:05:50.2834 +00:00","completedAt":null,"errors":[]
  }
 }
}
}

Ich möchte pro Shipment eine Zeile generieren. Das heißt ich müsste theoretisch durch alle sub-nodes von "purchaseOrders" iterieren. Ich weiß aber leider nicht wie ich auf child-nodes zugreifen kann.


Ich hatte das auch bereits mit {autoExpand : asRows} probiert, da bekomme ich aber pro Call nur eine Zeile zurück, heißt also er überschreibt die bestehende Zeile immer wieder. Ich glaube das liegt daran, dass die shipments nicht in einem Array liegen.


Wie könnte man das lösen?

Viele Grüße

Stefan


Die Idee mit ?matches ist gut. 


Hier mal noch ein anderer Ansatz aber ähnliche Idee:


<#---
Example JSON: 

{
  "data": {
    "purchaseOrders": {
      "shipment_1": {
        "id": "136333",
        "handle": "A54E4B01-1BBA-4F43-9842-36F4D0ED58D6",
        "status": "NEW",
        "submittedAt": "2020-08-18 15:05:49.8371 +00:00",
        "completedAt": null,
        "errors": []
      },
      "shipment_2": {
        "id": "136334",
        "handle": "CEC637D5-AA91-4C2B-9496-67C7C60D9596",
        "status": "NEW",
        "submittedAt": "2020-08-18 15:05:50.2834 +00:00",
        "completedAt": null,
        "errors": []
      }
    }
  }
}

-->

<#assign row = target.addRow()> <#-- Header -->

<#assign purchaseOrders = json['data']['purchaseOrders']>

<#list purchaseOrders as porder>
   <#-- assumption: to to get up to max. 10 shipments. shipments are ordered *_1 to *_x -->
  <#list 1..10 as i>
      <#assign row = target.addRow()>
       <#if porder['shipment_'+i]??>
        ${addColumns(row,  porder['shipment_'+i])}
       </#if>
    </#list>
</#list>


<#-- Result: -->

"id";"handle";"status";"submittedAt";"completedAt";"errors"
"136333";"A54E4B01-1BBA-4F43-9842-36F4D0ED58D6";"NEW";"2020-08-18 15:05:49.8371 +00:00";"";""
"136334";"CEC637D5-AA91-4C2B-9496-67C7C60D9596";"NEW";"2020-08-18 15:05:50.2834 +00:00";"";""


 


Dieser Ansatz geht davon aus, dass es pro PurchaseOrder max. eine Handvoll durchnummerierter Shipments gibt. 


Wir nehmen das mal als Anlass um noch nach anderen Möglichkeit zu suchen. Aber aktuell fällt uns auch nichts besseres ein.


1 Person gefällt dies

 Versuch's mal hiermit. Mit ?matches wird nach allen Shipment_...-Nodes gesucht und anschließend über alle gefundenen Nodes iteriert.

<#assign row = target.addRow()> <#-- Header -->

<#assign all_shipments = json['data']['purchaseOrders']?matches('shipment_\\d*')>
<#list all_shipments as shipment>
<#assign row = target.addRow()>
${addColumns(row,  json['data']['purchaseOrders'][shipment!])}
</#list>

 

Vielleicht gibt's noch einen schöneren/einfacheren Weg. Das überlasse ich dem Synesty-Team, den zu finden.


1 Person gefällt dies
Anmelden um einen Kommentar zu veröffentlichen