JSON für API HTTP Aufrufe generieren
Hallo Zusammen,
immer wieder habe ich das Problem dass es mir in Ninox mein JSON Body verhaut.
Meist wenn ich über eine Loop ein Array von Objekten erstellen muss.
Wie z.B. in diesem Beispiel bei der UPS API:
{
"ShipmentRequest": {
"Shipment": {
"Description": "1206 PTR",
"Shipper": {
"Name": "ShipperName",
"AttentionName": "AttentionName",
"TaxIdentificationNumber": "TaxID",
"Phone": {
"Number": "1234567890"
},
"ShipperNumber": "ShipperNumber",
"Address": {
"AddressLine": "AddressLine",
"City": "City",
"StateProvinceCode": "StateProvince",
"PostalCode": "PostalCode",
"CountryCode": "CountryCode"
}
},
"ShipTo": {
"Name": "ShipToName",
"AttentionName": "AttentionName",
"Phone": {
"Number": "1234567890"
},
"FaxNumber": "1234567999",
"TaxIdentificationNumber": "456999",
"Address": {
"AddressLine": "AddressLine",
"City": "City",
"StateProvinceCode": "StateProvince",
"PostalCode": "PostalCode",
"CountryCode": "CountryCode"
}
},
"ShipFrom": {
"Name": "ShipperName",
"AttentionName": "AttentionName",
"Phone": {
"Number": "1234567890"
},
"FaxNumber": "1234567999",
"TaxIdentificationNumber": "456999",
"Address": {
"AddressLine": "AddressLine",
"City": "City",
"StateProvinceCode": "StateProvince",
"PostalCode": "PsotalCode",
"CountryCode": "CountryCode"
}
},
"PaymentInformation": {
"ShipmentCharge": {
"Type": "01",
"BillShipper": {
"AccountNumber": "AccountNumber"
}
}
},
"Service": {
"Code": "01",
"Description": "Expedited"
},
"Package": [
{
"Description": "International Goods",
"Packaging": {
"Code": "02"
},
"PackageWeight": {
"UnitOfMeasurement": {
"Code": "LBS"
},
"Weight": "10"
},
"PackageServiceOptions": ""
},
{
"Description": "International Goods",
"Packaging": {
"Code": "02"
},
"PackageWeight": {
"UnitOfMeasurement": {
"Code": "LBS"
},
"Weight": "20"
},
"PackageServiceOptions": ""
}
],
"ItemizedChargesRequestedIndicator": "",
"RatingMethodRequestedIndicator": "",
"TaxInformationIndicator": "",
"ShipmentRatingOptions": {
"NegotiatedRatesIndicator": ""
}
},
"LabelSpecification": {
"LabelImageFormat": {
"Code": "GIF"
}
}
}
}
Unter „ShipmentRequest.Shipment.Package“ erwartet die API ein array aus Objekten welche jeweils ein Paket darstellen.
Ein Paket sieht also so aus:{
"Description": "International Goods",
"Packaging": {
"Code": "02"
},
"PackageWeight": {
"UnitOfMeasurement": {
"Code": "LBS"
},
"Weight": "10"
},
"PackageServiceOptions": "“
}
und mehrere Pakete so:[
{
"Description": "International Goods",
"Packaging": {
"Code": "02"
},
"PackageWeight": {
"UnitOfMeasurement": {
"Code": "LBS"
},
"Weight": "10"
},
"PackageServiceOptions": ""
},
{
"Description": "International Goods",
"Packaging": {
"Code": "02"
},
"PackageWeight": {
"UnitOfMeasurement": {
"Code": "LBS"
},
"Weight": "20"
},
"PackageServiceOptions": ""
}
]
In meinem Skript habe ich eine Variable „Anzahl Pakete“ und möchte daraus dieses Array bauen:
concat( for p in range('Anzahl Pakete‘) do
{
Description: prodBeschreibung,
Packaging: {
Code: item(splitx(text(Paketart), "\s"), 0)
},
PackageWeight: {
UnitOfMeasurement: {
Code: "KGS"
},
Weight: Gewicht
},
PackageServiceOptions: ""
}
end)
Pack ich dieses skript in ein Funktionsfeld, sieht es super aus. Wenn ich aber mein JSON drumrum baue bekomme ich Escapezeichen rein vor jedem Anführungszeichen. Und das bekomme ich nicht weg.
Habt ihr da eine Lösung?
4 Antworten
-
Hallo Benjamin
Weshalb es in der Schleife passiert weiss ich auf die Schnelle auch nicht.
Ein workaround ist vielleicht das Ergebnis der Schleife 'Package' mit formatJSON() in einen Text umzuwandeln. Anschließend mit replacex() die Escapezeichen zu löschen, sofern kein Link enthalten ist und mit parseJSON() daraus wieder ein Objekt zu erstellen und weiter zu verarbeiten. -
Mach concat vorne weg. Dann bekommst einen Array in der Variable und kannst diese einbauen
Leo
-
Ein Mix aus euren Lösungen hat geholfen.
let packages := parseJSON(replacex(formatJSON(for p in range('Anzahl Pakete') do
{
Description: "International Goods",
Packaging: {
Code: "02"
},
PackageWeight: {
UnitOfMeasurement: {
Code: "KGS"
},
Weight: "15"
},
PackageServiceOptions: ""
}
end), "\\", ""));
Wenn ich das dann unter packages ins große JSON einbaue funktioniert es! ;-)
Vielen Dank euche beiden! Auf die Ninox Community ist halt Verlass.
Gruß
Benjamin -
Hallo Benjamin,
und was passiert wenn du es so schreibst:
---
let packages := for p in range('Anzahl Pakete') do
{
Description: "International Goods",
Packaging: {
Code: "02"
},
PackageWeight: {
UnitOfMeasurement: {
Code: "KGS"
},
Weight: "15"
},
PackageServiceOptions: ""
}
end;---
Leo
Content aside
- vor 3 JahrenZuletzt aktiv
- 4Antworten
- 283Ansichten