How to group flight segments/legs in Bargain Finder Max? - json
I am trying to search for flights between two places in Sabre using BargainFindermax API. The API provides me with a list of all flights. However, there is no direct relation to which of the flights are linked.
For example, I searched for flights between BLR > LCY. The response I got included flights for AMS > LCY, BLR > DEL, BLR > DEL, DEL > AMS, AMS > LCY.
From this, I can construct the following route BLR > DEL > AMS > LCY. But there are two flights for BLR > DEL and AMS > LCY.
How can I identify which of these flights are related?
Here is the complete JSON response,
{
"groupedItineraryResponse": {
"version": "5.2.0",
"messages": [
{
"severity": "Info",
"type": "WORKERTHREAD",
"code": "TRANSACTIONID",
"text": "2074398531853061390"
},
{
"severity": "Info",
"type": "SERVER",
"code": "ASE032LPSCIL9UM.IDM.SGDCCERT.SABRE.COM",
"text": "27036"
},
{
"severity": "Info",
"type": "DRE",
"code": "RULEID",
"text": "17203"
},
{
"severity": "Info",
"type": "DEFAULT",
"code": "RULEID",
"text": "25238"
}
],
"statistics": {
"itineraryCount": 2
},
"scheduleDescs": [
{
"id": 1,
"frequency": "*MTWTFS",
"stopCount": 0,
"eTicketable": true,
"totalMilesFlown": 257,
"departure": {
"airport": "AMS",
"city": "AMS",
"country": "NL",
"time": "08:45:00+02:00"
},
"arrival": {
"airport": "LCY",
"city": "LON",
"country": "GB",
"time": "08:50:00+01:00"
},
"carrier": {
"marketing": "KL",
"marketingFlightNumber": 985,
"operating": "KL",
"operatingFlightNumber": 985,
"codeShared": "/KLM CITYHOPPER",
"equipment": {
"code": "E90",
"typeForFirstLeg": "N",
"typeForLastLeg": "N"
}
}
},
{
"id": 2,
"trafficRestriction": "G",
"frequency": "SMTWTFS",
"stopCount": 0,
"eTicketable": true,
"totalMilesFlown": 1058,
"departure": {
"airport": "BLR",
"city": "BLR",
"country": "IN",
"time": "19:50:00+05:30"
},
"arrival": {
"airport": "DEL",
"city": "DEL",
"country": "IN",
"time": "22:50:00+05:30",
"terminal": "3"
},
"carrier": {
"marketing": "KL",
"marketingFlightNumber": 3798,
"operating": "9W",
"operatingFlightNumber": 812,
"disclosure": "9W",
"equipment": {
"code": "73H",
"typeForFirstLeg": "N",
"typeForLastLeg": "N"
}
}
},
{
"id": 3,
"trafficRestriction": "G",
"frequency": "SMTWTFS",
"stopCount": 0,
"eTicketable": true,
"totalMilesFlown": 1058,
"departure": {
"airport": "BLR",
"city": "BLR",
"country": "IN",
"time": "18:55:00+05:30"
},
"arrival": {
"airport": "DEL",
"city": "DEL",
"country": "IN",
"time": "22:00:00+05:30",
"terminal": "3"
},
"carrier": {
"marketing": "KL",
"marketingFlightNumber": 3703,
"operating": "9W",
"operatingFlightNumber": 833,
"disclosure": "9W",
"equipment": {
"code": "738",
"typeForFirstLeg": "N",
"typeForLastLeg": "N"
}
}
},
{
"id": 4,
"frequency": "*M**T**",
"stopCount": 0,
"eTicketable": true,
"totalMilesFlown": 3961,
"departure": {
"airport": "DEL",
"city": "DEL",
"country": "IN",
"time": "02:10:00+05:30",
"terminal": "3"
},
"arrival": {
"airport": "AMS",
"city": "AMS",
"country": "NL",
"time": "07:40:00+02:00"
},
"carrier": {
"marketing": "KL",
"marketingFlightNumber": 3817,
"operating": "9W",
"operatingFlightNumber": 234,
"disclosure": "9W",
"equipment": {
"code": "333",
"typeForFirstLeg": "W",
"typeForLastLeg": "W"
}
}
},
{
"id": 5,
"frequency": "*MTWTFS",
"stopCount": 0,
"eTicketable": true,
"totalMilesFlown": 257,
"departure": {
"airport": "AMS",
"city": "AMS",
"country": "NL",
"time": "09:25:00+02:00"
},
"arrival": {
"airport": "LCY",
"city": "LON",
"country": "GB",
"time": "09:30:00+01:00"
},
"carrier": {
"marketing": "KL",
"marketingFlightNumber": 987,
"operating": "KL",
"operatingFlightNumber": 987,
"codeShared": "/KLM CITYHOPPER",
"equipment": {
"code": "E90",
"typeForFirstLeg": "N",
"typeForLastLeg": "N"
}
}
}
],
"taxDescs": [
{
"id": 1,
"code": "YRI",
"amount": 160,
"currency": "USD",
"description": "SERVICE FEE - CARRIER-IMPOSED MISC",
"publishedAmount": 160,
"publishedCurrency": "USD",
"station": "DEL"
},
{
"id": 2,
"code": "YQI",
"amount": 13.3,
"currency": "USD",
"description": "SERVICE FEE - INSURANCE",
"publishedAmount": 925,
"publishedCurrency": "INR",
"station": "BLR"
},
{
"id": 3,
"code": "WO",
"amount": 3.8,
"currency": "USD",
"description": "PASSENGER SERVICE FEE",
"publishedAmount": 3.8,
"publishedCurrency": "USD",
"station": "BLR",
"country": "IN"
},
{
"id": 4,
"code": "K38",
"amount": 11.5,
"currency": "USD",
"description": "GOODS AND SERVICE TAX INTERIM DOMESTIC AND INTERNATIONAL",
"publishedAmount": 799,
"publishedCurrency": "INR",
"station": "BLR",
"country": "IN"
},
{
"id": 5,
"code": "CJ",
"amount": 7.4,
"currency": "USD",
"description": "SECURITY SERVICE CHARGE",
"publishedAmount": 6.5,
"publishedCurrency": "EUR",
"station": "AMS",
"country": "NL"
},
{
"id": 6,
"code": "RN",
"amount": 7.3,
"currency": "USD",
"description": "PASSENGER SERVICE CHARGE",
"publishedAmount": 6.4,
"publishedCurrency": "EUR",
"station": "AMS",
"country": "NL"
},
{
"id": 7,
"code": "IN",
"amount": 5.2,
"currency": "USD",
"description": "USER DEVELOPMENT FEE DEPARTURES",
"publishedAmount": 362,
"publishedCurrency": "INR",
"station": "BLR",
"country": "IN"
}
],
"taxSummaryDescs": [
{
"id": 1,
"code": "YRI",
"amount": 160,
"currency": "USD",
"description": "SERVICE FEE - CARRIER-IMPOSED MISC",
"publishedAmount": 160,
"publishedCurrency": "USD",
"station": "DEL"
},
{
"id": 2,
"code": "YQI",
"amount": 13.3,
"currency": "USD",
"description": "SERVICE FEE - INSURANCE",
"publishedAmount": 925,
"publishedCurrency": "INR",
"station": "BLR"
},
{
"id": 3,
"code": "WO",
"amount": 3.8,
"currency": "USD",
"description": "PASSENGER SERVICE FEE",
"publishedAmount": 3.8,
"publishedCurrency": "USD",
"station": "BLR",
"country": "IN"
},
{
"id": 4,
"code": "K38",
"amount": 11.5,
"currency": "USD",
"description": "GOODS AND SERVICE TAX INTERIM DOMESTIC AND INTERNATIONAL",
"publishedAmount": 0.05,
"publishedCurrency": "INR",
"station": "BLR",
"country": "IN"
},
{
"id": 5,
"code": "CJ",
"amount": 7.4,
"currency": "USD",
"description": "SECURITY SERVICE CHARGE",
"publishedAmount": 6.5,
"publishedCurrency": "EUR",
"station": "AMS",
"country": "NL"
},
{
"id": 6,
"code": "RN",
"amount": 7.3,
"currency": "USD",
"description": "PASSENGER SERVICE CHARGE",
"publishedAmount": 6.4,
"publishedCurrency": "EUR",
"station": "AMS",
"country": "NL"
},
{
"id": 7,
"code": "IN",
"amount": 5.2,
"currency": "USD",
"description": "USER DEVELOPMENT FEE DEPARTURES",
"publishedAmount": 362,
"publishedCurrency": "INR",
"station": "BLR",
"country": "IN"
}
],
"fareComponentDescs": [
{
"id": 1,
"governingCarrier": "KL",
"fareAmount": 24.65,
"fareCurrency": "INR",
"fareBasisCode": "XPLWIA",
"farePassengerType": "ADT",
"publishedFareAmount": 1717,
"oneWayFare": true,
"directionality": "FROM",
"direction": "EH",
"notValidBefore": "2019-07-21",
"notValidAfter": "2019-07-21",
"applicablePricingCategories": "4 5 6 7 8 10 12 16 18",
"vendorCode": "ATP",
"fareTypeBitmap": "00",
"fareType": "PRU",
"fareTariff": "4",
"fareRule": "INPL",
"segments": [
{
"segment": {
"surcharges": [
{
"amount": 28.71,
"currency": "NUC",
"description": "MISCELLANEOUS/OTHER",
"type": "Q"
}
]
}
},
{
"segment": {}
},
{
"segment": {}
}
]
}
],
"validatingCarrierDescs": [
{
"id": 1,
"settlementMethod": "ARC",
"newVcxProcess": true,
"default": {
"code": "DL"
}
}
],
"baggageAllowanceDescs": [
{
"id": 1,
"pieceCount": 1
}
],
"legDescs": [
{
"id": 1,
"schedules": [
{
"ref": 2
},
{
"ref": 4,
"departureDateAdjustment": 1
},
{
"ref": 5,
"departureDateAdjustment": 1
}
]
},
{
"id": 2,
"schedules": [
{
"ref": 3
},
{
"ref": 4,
"departureDateAdjustment": 1
},
{
"ref": 1,
"departureDateAdjustment": 1
}
]
}
],
"itineraryGroups": [
{
"groupDescription": {
"legDescriptions": [
{
"departureDate": "2019-07-21",
"departureLocation": "BLR",
"arrivalLocation": "LCY"
}
]
},
"itineraries": [
{
"id": 1,
"pricingSource": "ADVJR1",
"legs": [
{
"ref": 2
}
],
"pricingInformation": [
{
"pricingSubsource": "MIP",
"fare": {
"validatingCarrierCode": "DL",
"vita": true,
"eTicketable": true,
"lastTicketDate": "2019-07-05",
"governingCarriers": "KL",
"passengerInfoList": [
{
"passengerInfo": {
"passengerType": "ADT",
"passengerNumber": 1,
"nonRefundable": true,
"fareComponents": [
{
"ref": 1,
"segments": [
{
"segment": {
"bookingCode": "X",
"cabinCode": "Y",
"mealCode": "D",
"seatsAvailable": 9
}
},
{
"segment": {
"bookingCode": "X",
"cabinCode": "Y",
"mealCode": "RB",
"seatsAvailable": 9
}
},
{
"segment": {
"bookingCode": "L",
"cabinCode": "Y",
"mealCode": "M",
"seatsAvailable": 9,
"availabilityBreak": true
}
}
]
}
],
"taxes": [
{
"ref": 2
},
{
"ref": 1
},
{
"ref": 7
},
{
"ref": 4
},
{
"ref": 3
},
{
"ref": 5
},
{
"ref": 6
}
],
"taxSummaries": [
{
"ref": 2
},
{
"ref": 1
},
{
"ref": 3
},
{
"ref": 4
},
{
"ref": 7
},
{
"ref": 5
},
{
"ref": 6
}
],
"currencyConversion": {
"from": "INR",
"to": "USD",
"exchangeRateUsed": 0.01442679
},
"fareMessages": [
{
"type": "N",
"code": "0",
"carrier": "KL",
"info": "FARE RESTRICTIONS APPLY/CARRIER RESTRICTIONS APPLY"
},
{
"type": "W",
"code": "0",
"info": "VALIDATING CARRIER - DL PER GSA AGREEMENT WITH KL"
}
],
"passengerTotalFare": {
"totalFare": 264.5,
"totalTaxAmount": 208.5,
"currency": "USD",
"baseFareAmount": 3875,
"baseFareCurrency": "INR",
"equivalentAmount": 56,
"equivalentCurrency": "USD",
"constructionAmount": 55.59,
"constructionCurrency": "NUC",
"commissionPercentage": 0,
"commissionAmount": 0,
"exchangeRateOne": 69.651352
},
"baggageInformation": [
{
"provisionType": "A",
"airlineCode": "KL",
"segments": [
{
"id": 0
},
{
"id": 1
},
{
"id": 2
}
],
"allowance": {
"ref": 1
}
}
]
}
}
],
"totalFare": {
"totalPrice": 264.5,
"totalTaxAmount": 208.5,
"currency": "USD",
"baseFareAmount": 3875,
"baseFareCurrency": "INR",
"constructionAmount": 55.59,
"constructionCurrency": "NUC",
"equivalentAmount": 56,
"equivalentCurrency": "USD"
},
"validatingCarriers": [
{
"ref": 1
}
]
}
}
],
"diversitySwapper": {
"weighedPrice": 409.855
}
},
{
"id": 2,
"pricingSource": "ADVJR1",
"legs": [
{
"ref": 1
}
],
"pricingInformation": [
{
"pricingSubsource": "MIP",
"fare": {
"validatingCarrierCode": "DL",
"vita": true,
"eTicketable": true,
"lastTicketDate": "2019-07-05",
"governingCarriers": "KL",
"passengerInfoList": [
{
"passengerInfo": {
"passengerType": "ADT",
"passengerNumber": 1,
"nonRefundable": true,
"fareComponents": [
{
"ref": 1,
"segments": [
{
"segment": {
"bookingCode": "X",
"cabinCode": "Y",
"mealCode": "D",
"seatsAvailable": 9
}
},
{
"segment": {
"bookingCode": "X",
"cabinCode": "Y",
"mealCode": "RB",
"seatsAvailable": 9
}
},
{
"segment": {
"bookingCode": "L",
"cabinCode": "Y",
"mealCode": "M",
"seatsAvailable": 9,
"availabilityBreak": true
}
}
]
}
],
"taxes": [
{
"ref": 2
},
{
"ref": 1
},
{
"ref": 7
},
{
"ref": 4
},
{
"ref": 3
},
{
"ref": 5
},
{
"ref": 6
}
],
"taxSummaries": [
{
"ref": 2
},
{
"ref": 1
},
{
"ref": 3
},
{
"ref": 4
},
{
"ref": 7
},
{
"ref": 5
},
{
"ref": 6
}
],
"currencyConversion": {
"from": "INR",
"to": "USD",
"exchangeRateUsed": 0.01442679
},
"fareMessages": [
{
"type": "N",
"code": "0",
"carrier": "KL",
"info": "FARE RESTRICTIONS APPLY/CARRIER RESTRICTIONS APPLY"
},
{
"type": "W",
"code": "0",
"info": "VALIDATING CARRIER - DL PER GSA AGREEMENT WITH KL"
}
],
"passengerTotalFare": {
"totalFare": 264.5,
"totalTaxAmount": 208.5,
"currency": "USD",
"baseFareAmount": 3875,
"baseFareCurrency": "INR",
"equivalentAmount": 56,
"equivalentCurrency": "USD",
"constructionAmount": 55.59,
"constructionCurrency": "NUC",
"commissionPercentage": 0,
"commissionAmount": 0,
"exchangeRateOne": 69.651352
},
"baggageInformation": [
{
"provisionType": "A",
"airlineCode": "KL",
"segments": [
{
"id": 0
},
{
"id": 1
},
{
"id": 2
}
],
"allowance": {
"ref": 1
}
}
]
}
}
],
"totalFare": {
"totalPrice": 264.5,
"totalTaxAmount": 208.5,
"currency": "USD",
"baseFareAmount": 3875,
"baseFareCurrency": "INR",
"constructionAmount": 55.59,
"constructionCurrency": "NUC",
"equivalentAmount": 56,
"equivalentCurrency": "USD"
},
"validatingCarriers": [
{
"ref": 1
}
]
}
}
],
"diversitySwapper": {
"weighedPrice": 367.631
}
}
]
}
]
}
}
You have to use legDescs list to connect your segments, and use those "ref" values.
For example:
{
"id": 2,
"schedules": [
{
"ref": 3
},
{
"departureDateAdjustment": 1,
"ref": 4
},
{
"departureDateAdjustment": 1,
"ref": 1
}
]
}
means, your flight with ID = 2 contains 3 segments, with id 3 - 4 and 1. When you search numbered segments in "scheduleDescs" object, you can see routes are:
BLR - DEL
DEL - AMS
AMS - LCY
and as you can see you got the BLR - LCY flight.
Related
Flutter dynamic data from api to make Widgets
In my case the json will be different every time and i have to make widget like "inputtype": "dropdown", "inputtype": "radiobutton" but if i craete model it don't go as i wants it to. { "fields": [ { "id": 31, "name": "make", "isrequired": "required", "valuetype": "text", "priority": 1, "inputtype": "dropdown", "max_min": [], "rangeable": "false", "choices": [ { "id": 46, "name": "Samsung", "categoryextrafield_id": 31, "created_at": "2021-12-29T01:30:47.000000Z", "updated_at": "2021-12-29T01:30:47.000000Z", "priority": 10 }, { "id": 47, "name": "Dell", "categoryextrafield_id": 31, "created_at": "2021-12-29T01:30:52.000000Z", "updated_at": "2021-12-29T01:30:52.000000Z", "priority": 20 }, { "id": 48, "name": "IBM", "categoryextrafield_id": 31, "created_at": "2021-12-29T01:31:09.000000Z", "updated_at": "2021-12-29T01:31:09.000000Z", "priority": 30 }, { "id": 49, "name": "Acer", "categoryextrafield_id": 31, "created_at": "2021-12-29T01:31:24.000000Z", "updated_at": "2021-12-29T01:31:24.000000Z", "priority": 40 } ], "available": [] }, { "id": 32, "name": "model", "isrequired": "required", "valuetype": "text", "priority": 2, "inputtype": "textfield", "max_min": [], "rangeable": "false", "choices": [], "available": [ { "model": "a51" }, { "model": "y9s" }, { "model": "a31" }, { "model": "yS10" }, { "model": "Y10S" }, { "model": "A551" }, { "model": "node8" }, { "model": "s9" }, { "model": null }, { "model": "2021" }, { "model": "2020" }, { "model": "2010" }, { "model": "Civic" }, { "model": "2019" }, { "model": "Daewooy9" }, { "model": "corei5" }, { "model": "corei9" }, { "model": "corei3" }, { "model": "corei11" } ] }, { "id": 29, "name": "features", "isrequired": "required", "valuetype": "text", "priority": 3, "inputtype": "checkbox", "max_min": [], "rangeable": "false", "choices": [ { "id": 41, "name": "Bluetooth", "categoryextrafield_id": 29, "created_at": "2021-12-29T01:19:00.000000Z", "updated_at": "2021-12-29T01:19:00.000000Z", "priority": 1 }, { "id": 42, "name": "Fingerprint", "categoryextrafield_id": 29, "created_at": "2021-12-29T01:19:10.000000Z", "updated_at": "2021-12-29T01:19:10.000000Z", "priority": 10 }, { "id": 43, "name": "LedDisplay", "categoryextrafield_id": 29, "created_at": "2021-12-29T01:19:35.000000Z", "updated_at": "2021-12-29T01:19:35.000000Z", "priority": 15 } ], "available": [] }, { "id": 30, "name": "condition", "isrequired": "required", "valuetype": "text", "priority": 4, "inputtype": "radiobutton", "max_min": [], "rangeable": "false", "choices": [ { "id": 44, "name": "Used", "categoryextrafield_id": 30, "created_at": "2021-12-29T01:20:31.000000Z", "updated_at": "2021-12-29T01:20:31.000000Z", "priority": 10 }, { "id": 45, "name": "New", "categoryextrafield_id": 30, "created_at": "2021-12-29T01:20:38.000000Z", "updated_at": "2021-12-29T01:20:38.000000Z", "priority": 20 } ], "available": [] } ] }
How to get a json key that contains a specific string with jq?
I have a json data like this: { "success": true, "module": { "endpoint": { "mode": "pc", "protocolVersion": "2.0" }, "reload": true, "data": { "leftContainer_CL": { "id": "CL", "tag": "leftContainer", "fields": { "css": { "floatPosition": "left", "width": "788px" }, "tag": "leftContainer" }, "type": "container" }, "container_C": { "id": "C", "tag": "container", "fields": { "css": { "marginTop": "12px" }, "tag": "container" }, "type": "container" }, "delivery_dfdaf8a8a": { "id": "dfdaf8a8a", "tag": "delivery", "fields": { "selectPos": "right", "deliveryBy": { "text": "Disediakan oleh", "poster": "ALL ITEM STORE" }, "options": [ { "highlight": false, "deliveryId": "STANDARD", "bgColor": "#fafafa", "price": "Rp18.900", "disable": false, "reachTime": "Dapatkan pada\n 3-4 Apr 2018", "liveUp": false, "selected": true } ], "style": "bar" }, "type": "biz" }, "rightContainer_CR": { "id": "CR", "tag": "rightContainer", "fields": { "css": { "floatPosition": "right", "width": "388px" }, "tag": "rightContainer" }, "type": "container" }, "delivery_d43597338a": { "id": "d43597338a", "tag": "delivery", "fields": { "selectPos": "right", "deliveryBy": { "text": "Disediakan oleh", "poster": "incredible accessories hp" }, "options": [ { "highlight": false, "deliveryId": "STANDARD", "bgColor": "#fafafa", "price": "Rp37.800", "disable": false, "reachTime": "Dapatkan pada\n 3-4 Apr 2018", "liveUp": false, "selected": true } ], "style": "bar" }, "type": "biz" }, "orderSummary_6": { "id": "6", "tag": "orderSummary", "fields": { "isOpen": "false", "summarys": [ { "tail": "(3 barang)", "title": "Subtotal", "value": "Rp23.557" }, { "title": "Biaya pengiriman", "value": "Rp56.700" } ], "title": "Ringkasan Pesanan\r\n" }, "type": "biz" }, "root_0": { "id": "0", "tag": "root", "fields": { "count": 3, "title": "Troli belanja Saya" }, "type": "root" }, "item_i77997d6b": { "id": "i77997d6b", "tag": "item", "fields": { "img": "https://id-live.slatic.net/original/08c1396908dc240625751b09decb4211.jpg", "quantity": { "qtyPrefix": "Kuantitas", "min": 1, "autoOptions": false, "quantity": 1, "max": 5, "editable": true, "showIncrDecr": true, "showOptions": false, "step": 1 }, "sellerName": "ALL ITEM STORE", "title": "Case Slim Black Matte Xiaomi Redmi 4A Softcase Black", "stockTip": {}, "valid": true, "itemId": "143800088", "operations": [ "wishlist", "delete" ], "sellerId": "100124080", "price": { "price": 6000, "currentPrice": "Rp6.000", "originPrice": "Rp30.000", "promotionRatio": "-80%" }, "restriction": false, "isGift": false, "sku": { "skuText": "Softcase, Hitam", "productVariant": "SO908ELAAVYY4AANID-72544754", "brandId": "17818", "skuId": "157608391" }, "itemUrl": "https://www.lazada.co.id/products/i143800088-s157608391.html?urlFlag=true&mp=1", "cartItemId": 2006547819 }, "type": "biz" }, "location_2": { "id": "2", "tag": "location", "fields": { "buttonText": "GANTI\r\n", "editable": true, "postCode": "", "style": "casAddress", "label": "Lokasi", "title": "Jawa Tengah,Kab. Boyolali,Ampel", "addressId": "R2388357-R80010396-R80015219" }, "type": "biz" }, "voucherInput_7": { "id": "7", "tag": "voucherInput", "fields": { "buttonText": "GUNAKAN", "placeHolder": "Masukkan Kode Voucher", "status": "default" }, "type": "biz", "validate": { "value": [ { "msg": "Maaf, voucher ini tidak dapat digunakan. Silahkan periksa jika ada kesalahan penulisan", "regex": "^$|^[ ]{0,5}[A-Za-z0-9~!##%&*()_+?<>{}|-]{1,100}[ ]{0,5}$" } ] } }, "shop_43597338a_s2c": { "id": "43597338a_s2c", "tag": "shop", "fields": { "badges": [], "link": "//www.lazada.co.id/shop/incredible-accessories-hp", "name": "incredible accessories hp" }, "type": "biz" }, "item_i7799f86e": { "id": "i7799f86e", "tag": "item", "fields": { "img": "http://id-live-02.slatic.net/p/2/case-anti-shock-anti-crack-elegant-softcase-for-xiaomi-redmi-5a-white-clear-free-tempered-glass-1273-94487227-9f8ddff53bde3f8de9eb514ba2172361-catalog.jpg", "quantity": { "qtyPrefix": "Kuantitas", "min": 1, "autoOptions": false, "quantity": 1, "max": 5, "editable": true, "showIncrDecr": true, "showOptions": false, "step": 1 }, "sellerName": "incredible accessories hp", "title": "Case Anti Shock / Anti Crack Elegant Softcase for Xiaomi Redmi 5A - White Clear + Free Tempered Glass", "stockTip": {}, "valid": true, "itemId": "160714927", "operations": [ "wishlist", "delete" ], "sellerId": "53631", "price": { "price": 13580, "currentPrice": "Rp13.580", "originPrice": "Rp25.000", "promotionRatio": "-46%" }, "restriction": false, "isGift": false, "sku": { "skuText": "Softcase, Bening", "productVariant": "SO908ELAB716EPANID-97510528", "brandId": "17818", "skuId": "183461134" }, "itemUrl": "https://www.lazada.co.id/products/i160714927-s183461134.html?urlFlag=true&mp=1", "cartItemId": 2006579310 }, "type": "biz" }, "package_p43597338a": { "id": "p43597338a", "tag": "package", "fields": {}, "type": "biz" }, "listHeader_H": { "id": "H", "tag": "listHeader", "fields": { "middle": "HARGA", "left": "3 barang", "right": "KUANTITAS" }, "type": "biz" }, "delivery_3": { "id": "3", "tag": "delivery", "fields": { "selectPos": "left", "options": [ { "highlight": false, "deliveryId": "STANDARD", "bgColor": "#fafafa", "price": "Rp56.700", "disable": false, "icon": "https://laz-img-cdn.alicdn.com/tfs/TB1UpyCpfDH8KJjy1XcXXcpdXXa-72-72.png", "name": "Standar", "reachTime": "Dapatkan pada\n 3-4 Apr 2018", "liveUp": false, "selected": true } ], "style": "card", "title": "Pengiriman yang dipilih" }, "type": "biz" }, "orderTotal_8": { "id": "8", "tag": "orderTotal", "fields": { "button": { "enable": true, "text": "LANJUTKAN KE PEMBAYARAN", "clicked": false }, "payment": { "taxTip": "Termasuk PPN, jika berlaku", "pay": "Rp80.257", "title": "Total" } }, "type": "biz" }, "shop_fdaf8a8a_s23f9": { "id": "fdaf8a8a_s23f9", "tag": "shop", "fields": { "badges": [], "link": "//www.lazada.co.id/shop/all-item-store", "name": "ALL ITEM STORE" }, "type": "biz" }, "floatTips_4": { "id": "4", "tag": "floatTips", "fields": { "tips": [] }, "type": "biz" }, "item_i7790e0f9": { "id": "i7790e0f9", "tag": "item", "fields": { "img": "http://id-live-02.slatic.net/p/2/case-anti-shock-anti-crack-elegant-softcase-for-xiaomi-redmi-note4x-white-clear-8431-85175402-0bec01e88741744ae5461c4b3a4ae160-catalog.jpg", "quantity": { "qtyPrefix": "Kuantitas", "min": 1, "autoOptions": false, "quantity": 1, "max": 5, "editable": true, "showIncrDecr": true, "showOptions": false, "step": 1 }, "sellerName": "incredible accessories hp", "title": "Case Anti Shock / Anti Crack Elegant Softcase for Xiaomi Redmi Note 4x - White Clear", "stockTip": {}, "valid": true, "itemId": "108849535", "operations": [ "wishlist", "delete" ], "sellerId": "53631", "price": { "price": 3977, "currentPrice": "Rp3.977", "originPrice": "Rp15.000", "promotionRatio": "-73%" }, "restriction": false, "isGift": false, "sku": { "skuText": "Sarung, Bening", "productVariant": "CA529ELAAC6GUEANID-27304198", "brandId": "10464", "skuId": "110628148" }, "itemUrl": "https://www.lazada.co.id/products/i108849535-s110628148.html?urlFlag=true&mp=1", "cartItemId": 2005983481 }, "type": "biz" }, "package_pfdaf8a8a": { "id": "pfdaf8a8a", "tag": "package", "fields": {}, "type": "biz" } }, "hierarchy": { "component": [ "container", "delivery", "item", "shop", "package", "listHeader", "orderSummary", "leftContainer", "orderTotal", "floatTips", "root", "location", "rightContainer", "voucherInput" ], "root": "root_0", "structure": { "package_p43597338a": [ "delivery_d43597338a", "shop_43597338a_s2c", "item_i7799f86e", "item_i7790e0f9" ], "leftContainer_CL": [ "delivery_3", "listHeader_H", "package_pfdaf8a8a", "package_p43597338a" ], "container_C": [ "leftContainer_CL", "rightContainer_CR" ], "rightContainer_CR": [ "location_2", "orderSummary_6" ], "orderSummary_6": [ "voucherInput_7", "orderTotal_8" ], "root_0": [ "container_C", "floatTips_4" ], "package_pfdaf8a8a": [ "delivery_dfdaf8a8a", "shop_fdaf8a8a_s23f9", "item_i77997d6b" ] } }, "linkage": { "input": [], "request": [ "voucherInput_7", "item_i7799f86e", "delivery_3", "orderTotal_8", "item_i7790e0f9", "location_2", "item_i77997d6b" ], "common": { "compress": true, "queryParams": "^^$$1afe141216814f45e9fc6dba84d4863d{$_$}H4sIAAAAAAAAAFWU247bRgyGXyXQ9caYGXJOe5fkJmmLot3de4Ez5OwKlSVBklMkQd69lJsNHBgwZIHfz9NPf+t2Wc/DRGN3/61bRtrbvJ67+26p3V230LPoc6V1777fdROd5XGh+vpu05DLJuu7bRuep0OgjrRtf2rYETGfTyN9JabTNfh0nlnG02Xc13k6LbTSeTv9fZH1y1/XZxVbZWJZ3w9ff7xRxXGutA/z9DTs46H6G/1Lb55keqaXu9+pnN68n7/MI43D3bvzIqOKEPMq2/aJNfrBQUrg49uHZIw1kMP/T97ZfPQ3b/sHrUoju+/aoJa8zJNM+/aoDdF+WeXa1TztNEyy9h800jUoDoPFWnMIVHwCMMiWCJ2zgVRX+xw+a2M9aHyMsbpqwcUChTgxeMZqbWzkJXl7G88IPkeARApKMCYQeJNYojCEVPTboMcCmOIvibgxtURXLrRaKGKrWdhHMslkE1ss2TjnCA+ujTPtT8Oy9XgkilVQsgEX2AXJgQ3UZCNb1yKEY1LDLud+iDEbMS0rYwAzx+KbE6JmcgCbs02YJShhyi2TI4eiTAHr0ROiZS0mOteYW9JChZwR+CVPbikce2Ev4HJiJmuab6TJIApIkZo4JFZmlKZb/LmiP66jqzVlEhe5GJEUs/XNk6csxYacDmrY9o9C6rf+oxJAHqAkJMc69RbZu+yBQKxFqTEcxA8r9u5wgagLRISDNuECYjAFk3NYUnU+Htczryr+eDmfSRcUlNEukSyVmqLXeNG9NnWF16RBV95emad5p7FPx5QNGnSUpHDUllsyGINQUKSp78L1Rus/eqb9cmsdgGp1vmpLcKjD1JsNTUGdqmu6olvuxjmlpaa7KV6wtkqU1UimOXA6gIjXk1mH55fbaT8olhJJMhFrrlwxRwuAmK00ELD6+8Dmee9Ndz9dxvGu217mpf9Zb7+5qirZ1YoYOXJlWw1r1Zz1w7kAxKvKlXutVzG4WlFvGUyKxkhB9RNL9ibmmoGTnkJFBT/Pl/oi66dpuex9VMa65LRQ0fRWnDjSZDogFZJkkYL+HfwHDyba3BsFAAA=", "submitParams": "^^$$f7898231e0216a924bcaa64d213a61ba{$_$}H4sIAAAAAAAAADXMQQrDMAwEwL/oHPSA3PqBUsgLto4bDJJtJPvS4L/XCfS2uwx7UoumKUNoPakK2qeY0ko10EIVR5w5wBqNhTI0bhXhv/kk3aM93NORr4MgcH9OdomiLPhiB9+YtexRuEuzkrnCoM5bf2tqr7vQGD8eVpdVjwAAAA==" }, "signature": "89dffd9ca23307e603556a4c896e4c56" } } } With jq I can do this: [me#linux]$ cat /tmp/json | jq '.module | .data | keys' [ "container_C", "delivery_3", "delivery_d43597338a", "delivery_dfdaf8a8a", "floatTips_4", "item_i7790e0f9", "item_i77997d6b", "item_i7799f86e", "leftContainer_CL", "listHeader_H", "location_2", "orderSummary_6", "orderTotal_8", "package_p43597338a", "package_pfdaf8a8a", "rightContainer_CR", "root_0", "shop_43597338a_s2c", "shop_fdaf8a8a_s23f9", "voucherInput_7" ] I need to get orderTotal_8 but please note that the number 8 is always changing, so it can be orderTotal_10 or orderTotal_3 etc... How can I get this key with pure jq command if possible, without the help of grep / awk ? So the result should be like this orderTotal_8
If you want to form a subarray of items satisfying some condition, just add map(select( CONDITION )) to the pipeline, e.g. .module | .data | keys | map(select(test("^orderTotal_"))) If you just want a stream of the items matching the condition, then you could first form the stream, and then make the selection: .module | .data | keys[] | select(test("^orderTotal_")) For efficiency and other reasons, you might want to consider using keys_unsorted instead of keys.
Custom JSON format webhook WooCommerce Wordpress
I want my Woocommerce store connected to a shipping parcel company. There is no existing WooCommerce plugin for it. I want to do it with webhooks, I had already successfully made a POST request to a URL after the order.created action. The JSON output contains all the shipping information. But I want to change the format of the JSON output. The current JSON output is something like this. { "id": 605, "parent_id": 0, "status": "pending", "order_key": "wc_order_5893614a8fb78", "number": 605, "currency": "USD", "version": "2.6.13", "prices_include_tax": false, "date_created": "2017-02-02T16:41:46", "date_modified": "2017-02-02T16:41:46", "customer_id": 2, "discount_total": "0.00", "discount_tax": "0.00", "shipping_total": "13.60", "shipping_tax": "1.22", "cart_tax": "1.44", "total": "32.24", "total_tax": "2.66", "billing": { "first_name": "Damandeep", "last_name": "Singh", "company": "", "address_1": "1257 ", "address_2": "Coach House Court", "city": "Fullerton", "state": "CA", "postcode": "92831", "country": "US", "email": "daman#singhdd.com", "phone": "(122) 274-5555" }, "shipping": { "first_name": "Damandeep", "last_name": "Singh", "company": "", "address_1": "1257", "address_2": "Coach House Court", "city": "Fullerton", "state": "CA", "postcode": "92831", "country": "US" }, "payment_method": "paypal_express", "payment_method_title": "Paypal Express", "transaction_id": "", "customer_ip_address": "103.41.36.35", "customer_user_agent": "PostmanRuntime/3.0.9", "created_via": "rest-api", "customer_note": "", "date_completed": "2017-02-02T08:41:46", "date_paid": "", "cart_hash": "", "line_items": [ { "id": 79, "name": "Kaju Katli", "sku": "SW-282", "product_id": 491, "variation_id": 494, "quantity": 1, "tax_class": "", "price": "15.98", "subtotal": "15.98", "subtotal_tax": "1.44", "total": "15.98", "total_tax": "1.44", "taxes": [ { "id": 1, "total": 1.4382, "subtotal": 1.4382 } ], "meta": [ { "key": "packing-size", "label": "Packing Size", "value": "2lb Box" } ] } ], "tax_lines": [ { "id": 81, "rate_code": "SALES TAX-1", "rate_id": "1", "label": "Sales Tax", "compound": false, "tax_total": "1.44", "shipping_tax_total": "1.22" } ], "shipping_lines": [ { "id": 80, "method_title": "USPS Medium Flat Rate Box", "method_id": "usps_medium_box", "total": "13.60", "total_tax": "0.00", "taxes": [] } ], "fee_lines": [], "coupon_lines": [], "refunds": [], "_links": { "self": [ { "href": "https://ambala.webdemos.cf/wp-json/wc/v1/orders/605" } ], "collection": [ { "href": "https://ambala.webdemos.cf/wp-json/wc/v1/orders" } ], "customer": [ { "href": "https://ambala.webdemos.cf/wp-json/wc/v1/customers/2" } ] } } The JSON output should be something like this. { "name": "Gijs Boersma", "street": "Lange laan", "house_number": "29", "house_number_extension": "a", "zipcode": "9281EM", "city": "Zevenaar", "telephone": "0602938172", "email": "noreply#example.com", "reference": "Bestelling 112", "pick_up_point": { "uuid": "560db083-d941-425b-b3b6-b813718297e1" }, "product": "sameday_parcel_medium", "product_options": [ { "option": "allow_neighbours", "value": false }, { "option": "require_signature", "value": false }, { "option": "age_check_18", "value": false }, { "option": "perishable", "value": true, "max_attempts": 2 } ] }
you can do this by the orders filter. add_filter( 'woocommerce_rest_prepare_shop_order_object', 'change_shop_order_response', 10, 3 ); function change_shop_order_response( $response, $item, $request ) { //Do your stuff here with the $response object. return $response }
Convert json to include name and children values to feed D3
I am trying to get json converted from: { "Devices": [ { "Udid": "7a2b0e6c928f2321a75e423ba23ae93d", "SerialNumber": "RF1D232ZLEE", "MacAddress": "40F232726FC8", "Imei": "3576342323280150", "EasId": "SEC1BC252327E92B", "AssetNumber": "7a2b0e23223928f2321a75e423ba23ae93d", "DeviceFriendlyName": "gel1 Android Android 5.0.1 ZLEE ", "LocationGroupId": { "Id": { "Value": 19529 }, "Name": "Group Express" }, "LocationGroupName": "Group Express", "UserId": { "Name": "" }, "UserName": "", "UserEmailAddress": "", "Ownership": "S", "PlatformId": { "Id": { "Value": 5 }, "Name": "Android" }, "Platform": "Android", "ModelId": { "Id": { "Value": 5 }, "Name": "samsung GT-I9505" }, "Model": "samsung GT-I9505", "OperatingSystem": "5.0.1", "PhoneNumber": "+447881867010", "LastSeen": "2016-07-06T14:01:03.590", "EnrollmentStatus": "Unenrolled", "ComplianceStatus": "NotAvailable", "CompromisedStatus": false, "LastEnrolledOn": "2016-06-15T16:01:38.763", "LastComplianceCheckOn": "0001-01-01T00:00:00.000", "LastCompromisedCheckOn": "2016-07-06T13:58:26.183", "IsSupervised": false, "DeviceMCC": { "SIMMCC": "234", "CurrentMCC": "234" }, "AcLineStatus": 0, "VirtualMemory": 0, "Id": { "Value": 23459 } }, { "Udid": "c5f94db71d406dae7f881d3edf059e", "SerialNumber": "", "MacAddress": "000C300F9108", "Imei": "", "EasId": "D80DB85EC411C8E9B28BC292A603F05C2C0EEEC8", "AssetNumber": "c592f93db71d406dae7f881d3edf059e", "DeviceFriendlyName": "user Windows 10 WinRT 10.0.10240 ", "LocationGroupId": { "Id": { "Value": 18498 }, "Name": "Business Solutions" }, "LocationGroupName": "Business Solutions", "UserId": { "Name": "" }, "UserName": "", "UserEmailAddress": "", "Ownership": "C", "PlatformId": { "Id": { "Value": 12 }, "Name": "WinRT" }, "Platform": "WinRT", "ModelId": { "Id": { "Value": 50 }, "Name": "Windows 10" }, "Model": "Windows 10", "OperatingSystem": "10.0.10240", "PhoneNumber": "", "LastSeen": "2016-05-03T10:54:07.650", "EnrollmentStatus": "Unenrolled", "ComplianceStatus": "NotAvailable", "CompromisedStatus": false, "LastEnrolledOn": "2016-01-29T16:41:57.760", "LastComplianceCheckOn": "0001-01-01T00:00:00.000", "LastCompromisedCheckOn": "0001-01-01T00:00:00.000", "IsSupervised": false, "DeviceMCC": { "SIMMCC": "", "CurrentMCC": "" }, "AcLineStatus": 0, "VirtualMemory": 0, "Id": { "Value": 23545 } } ], "Page": 0, "PageSize": 500, "Total": 13} To something like: {"name": "Devices", "children": [ {"name":"Udid", "size":"7f0dsda63274692ea4f0b66fec67a020158"}, {"name":"SerialNumber", "size":"P988KJSPQF938"}, {"name":"MacAddress", "size":"1HJUSUD031C4"}, {"name":"Imei", "size":""}, {"name":"EasId", "size":"ApKJSPQF193"}, {"name":"AssetNumber", "size":"7f0cda636b3305fea4f0b66fec9997267a020158"}, {"name":"DeviceFriendlyName", "size":"TMcKenz iPad iOS 7.1.4 F193 "}, {"name":"LocationGroupId", "children": [ {"name":"Id","size":7488}, {"name":"Name","size":"MCM"} ] }, {"name":"UserId", "children": [ {"name":"Id","size":6418}, {"name":"Name","size":"Tom McKenz"} ] }, {"name":"UserName", "size":"TMcKenz"}, {"name":"UserEmailAddress", "size":"TMcKenz#awaw.com"} ] } Not sure what is the best practice here: is it possible to use D3.nest or do you need to iterate through all the nodes and change to 'name' and 'children' accordingly.
in2csv fail on JSON
I have a small JSON file which fails to convert a data value properly. The value in question is the "id" field and the conversion produces 2016-05-06. I have a much larger file (same format) and it works properly. Any help? { "results": [ { "seq": "10457-g1AAAAPreJy90lFqAjEQBuCgFj2B4EOpUgRfXNyscWef9CbtTMZFZF3Brs96E3uT9ib1IMIaE2XpmynUlwkE8n_8TDIhRGtRZzFg0uvNfMakAloNGbPhR4E544ZloLP1ljEvgnxeZOZFDQW9lGW5XNRJiKfnlblrYiRZqtQj6rcr73CpayZNK3pg6bGOmZE80vwr0-xCv1X0q6XViDGJ_t46vId-v9C7iu5YegIEmIw90vxb5w0zxd4cRj9c-Z7lSUEEIP-1ueM_Hf_l-MbJ8iGmxDE8oP2343-u7fvuy6WaRqQf0P7o-Nvu25ZPATRA6JG4PAMPEEFw", "id": "20160506175330-3168-01", "changes": [ { "rev": "1-8bda66017d962508e51ac5061557635b" } ], "doc": { "_id": "20160506175330-3168-01", "_rev": "1-8bda66017d962508e51ac5061557635b", "year": "2016", "month": "05", "day": "06", "hour": "17", "minute": "53", "second": "30", "imagebox": "18x94+428+180", "alchemy": { "text": "person", "score": "0.845535" }, "visual": { "image": "20160506175330-3168-01.jpg", "scores": [ { "classifier_id": "Mixed_Color", "name": "Mixed_Color", "score": 0.964822 }, { "classifier_id": "Stove", "name": "Stove", "score": 0.923713 }, { "classifier_id": "Archery", "name": "Archery", "score": 0.836994 }, { "classifier_id": "Dish_Washer", "name": "Dish_Washer", "score": 0.835787 }, { "classifier_id": "Barber_Shop", "name": "Barber_Shop", "score": 0.825716 }, { "classifier_id": "Full_Body", "name": "Full_Body", "score": 0.824954 }, { "classifier_id": "Musical_Instrument", "name": "Musical_Instrument", "score": 0.817304 }, { "classifier_id": "Beauty_Salon", "name": "Beauty_Salon", "score": 0.808518 }, { "classifier_id": "Clothing_Store", "name": "Clothing_Store", "score": 0.784035 }, { "classifier_id": "Distillery", "name": "Distillery", "score": 0.67477 }, { "classifier_id": "Sweet_Treat", "name": "Sweet_Treat", "score": 0.588916 }, { "classifier_id": "Beer", "name": "Beer", "score": 0.538915 }, { "classifier_id": "Store", "name": "Store", "score": 0.536244 }, { "classifier_id": "Yellow", "name": "Yellow", "score": 0.526932 } ] } } } ], "last_seq": "10457-g1AAAAPreJy90lFqAjEQBuCgFj2B4EOpUgRfXNyscWef9CbtTMZFZF3Brs96E3uT9ib1IMIaE2XpmynUlwkE8n_8TDIhRGtRZzFg0uvNfMakAloNGbPhR4E544ZloLP1ljEvgnxeZOZFDQW9lGW5XNRJiKfnlblrYiRZqtQj6rcr73CpayZNK3pg6bGOmZE80vwr0-xCv1X0q6XViDGJ_t46vId-v9C7iu5YegIEmIw90vxb5w0zxd4cRj9c-Z7lSUEEIP-1ueM_Hf_l-MbJ8iGmxDE8oP2343-u7fvuy6WaRqQf0P7o-Nvu25ZPATRA6JG4PAMPEEFw", "pending": 0 }
I needed to use --no-inference.