Arhn - архитектура программирования

Вложенный ответ JSON на CSV Python

Я искал несколько часов для решения, но ни одно из них не подходило для моего случая. Я новичок на этом форуме и последние несколько недель изучаю Python. Любая обратная связь очень приветствуется.

Я получаю следующий ответ JSON от API QPX Flights от Google:

{"trips": {"data": {"tax": [{"id": "CJ_001", "name": "Netherlands Security   Service Charge", "kind": "qpxexpress#taxData"}, {"id": "RN_001", "name": "Netherlands Passenger Service Charge", "kind": "qpxexpress#taxData"}], "carrier": [{"name": "British Airways", "kind": "qpxexpress#carrierData", "code": "BA"}, {"name": "KLM Royal Dutch Airlines", "kind": "qpxexpress#carrierData", "code": "KL"}], "airport": [{"name": "Amsterdam Schiphol Airport", "kind": "qpxexpress#airportData", "city": "AMS", "code": "AMS"}, {"name": "London Heathrow", "kind": "qpxexpress#airportData", "city": "LON", "code": "LHR"}], "kind": "qpxexpress#data", "city": [{"name": "Amsterdam", "kind": "qpxexpress#cityData", "code": "AMS"}, {"name": "London", "kind": "qpxexpress#cityData", "code": "LON"}], "aircraft": [{"name": "Airbus A320", "kind": "qpxexpress#aircraftData", "code": "320"}, {"name": "Airbus A321", "kind": "qpxexpress#aircraftData", "code": "321"}, {"name": "Airbus A320", "kind": "qpxexpress#aircraftData", "code": "32A"}, {"name": "Boeing 737", "kind": "qpxexpress#aircraftData", "code": "73W"}, {"name": "Boeing 767", "kind": "qpxexpress#aircraftData", "code": "767"}, {"name": "Fokker 70", "kind": "qpxexpress#aircraftData", "code": "F70"}]}, "kind": "qpxexpress#tripOptions", "requestId": "BhQ2khus9jXocXWm90PsxV", "tripOption": [{"id": "E4xALyuxnXOLIYn7wHGKfO001", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR50.00", "latestTicketingTime": "2017-01-29T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "AVLUwzfTaQlZrLiTu8VtkyPdViNbxFexh8kjsAELyroo", "segmentId": "G1zEk39f37ggRVWM"}], "baseFareTotal": "EUR50.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS BA LON 53.45OV2HO NUC 53.45 END ROE 0.935287 FARE EUR 50.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "BA", "origin": "AMS", "basisCode": "OV2HO", "id": "AVLUwzfTaQlZrLiTu8VtkyPdViNbxFexh8kjsAELyroo", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR73.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 65, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 65, "cabin": "COACH", "leg": [{"aircraft": "32A", "duration": 65, "origin": "AMS", "mileage": 229, "destinationTerminal": "5", "id": "LBxqFQJ94+nxA452", "kind": "qpxexpress#legInfo", "departureTime": "2017-02-23T22:00+01:00", "meal": "Food and Beverages for Purchase", "destination": "LHR", "arrivalTime": "2017-02-23T22:05+00:00"}], "bookingCode": "O", "id": "G1zEk39f37ggRVWM", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 5, "marriedSegmentGroup": "0", "flight": {"carrier": "BA", "number": "427"}}]}], "saleTotal": "EUR73.53"}, {"id": "E4xALyuxnXOLIYn7wHGKfO002", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR50.00", "latestTicketingTime": "2017-01-29T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "AVLUwzfTaQlZrLiTu8VtkyPdViNbxFexh8kjsAELyroo", "segmentId": "GCENLx0HbbMjpJuU"}], "baseFareTotal": "EUR50.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS BA LON 53.45OV2HO NUC 53.45 END ROE 0.935287 FARE EUR 50.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "BA", "origin": "AMS", "basisCode": "OV2HO", "id": "AVLUwzfTaQlZrLiTu8VtkyPdViNbxFexh8kjsAELyroo", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR73.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 80, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 80, "cabin": "COACH", "leg": [{"aircraft": "767", "duration": 80, "origin": "AMS", "mileage": 229, "destinationTerminal": "5", "id": "LI0hZuGKKlUxi13I", "kind": "qpxexpress#legInfo", "departureTime": "2017-02-23T10:25+01:00", "meal": "Food and Beverages for Purchase", "destination": "LHR", "arrivalTime": "2017-02-23T10:45+00:00"}], "bookingCode": "O", "id": "GCENLx0HbbMjpJuU", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 9, "marriedSegmentGroup": "0", "flight": {"carrier": "BA", "number": "429"}}]}], "saleTotal": "EUR73.53"}, {"id": "E4xALyuxnXOLIYn7wHGKfO004", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR52.00", "latestTicketingTime": "2017-02-02T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "Avqz5Oz2yvEq+Z9r2MO5Za+dHIbSnRoZ0dT09CoUNVDk", "segmentId": "G5-09q7T0cVtOyZK"}], "baseFareTotal": "EUR52.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS KL LHR 55.59TWKWNL NUC 55.59 END ROE 0.935287 FARE EUR 52.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "KL", "origin": "AMS", "basisCode": "TWKWNL", "id": "Avqz5Oz2yvEq+Z9r2MO5Za+dHIbSnRoZ0dT09CoUNVDk", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR75.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 80, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 80, "cabin": "COACH", "leg": [{"aircraft": "73W", "duration": 80, "origin": "AMS", "mileage": 229, "destinationTerminal": "4", "id": "LUzIvksstTUVZGdm", "kind": "qpxexpress#legInfo", "departureTime": "2017-02-23T16:40+01:00", "meal": "Snack or Brunch", "destination": "LHR", "arrivalTime": "2017-02-23T17:00+00:00"}], "bookingCode": "T", "id": "G5-09q7T0cVtOyZK", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 9, "marriedSegmentGroup": "0", "flight": {"carrier": "KL", "number": "1023"}}]}], "saleTotal": "EUR75.53"}, {"id": "E4xALyuxnXOLIYn7wHGKfO006", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR52.00", "latestTicketingTime": "2017-02-02T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "Avqz5Oz2yvEq+Z9r2MO5Za+dHIbSnRoZ0dT09CoUNVDk", "segmentId": "G+88fLqcZlZxtMPy"}], "baseFareTotal": "EUR52.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS KL LHR 55.59TWKWNL NUC 55.59 END ROE 0.935287 FARE EUR 52.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "KL", "origin": "AMS", "basisCode": "TWKWNL", "id": "Avqz5Oz2yvEq+Z9r2MO5Za+dHIbSnRoZ0dT09CoUNVDk", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR75.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 85, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 85, "cabin": "COACH", "leg": [{"duration": 85, "mileage": 229, "origin": "AMS", "operatingDisclosure": "OPERATED BY KLM CITYHOPPER", "departureTime": "2017-02-23T13:25+01:00", "destination": "LHR", "aircraft": "F70", "meal": "Snack or Brunch", "id": "LjrWqpaYFS0ZeCQu", "kind": "qpxexpress#legInfo", "destinationTerminal": "4", "arrivalTime": "2017-02-23T13:50+00:00"}], "bookingCode": "T", "id": "G+88fLqcZlZxtMPy", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 9, "marriedSegmentGroup": "0", "flight": {"carrier": "KL", "number": "1017"}}]}], "saleTotal": "EUR75.53"}, {"id": "E4xALyuxnXOLIYn7wHGKfO003", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR52.00", "latestTicketingTime": "2017-02-02T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "Avqz5Oz2yvEq+Z9r2MO5Za+dHIbSnRoZ0dT09CoUNVDk", "segmentId": "Gf7a6ekBsv4DkDJT"}], "baseFareTotal": "EUR52.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS KL LHR 55.59TWKWNL NUC 55.59 END ROE 0.935287 FARE EUR 52.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "KL", "origin": "AMS", "basisCode": "TWKWNL", "id": "Avqz5Oz2yvEq+Z9r2MO5Za+dHIbSnRoZ0dT09CoUNVDk", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR75.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 80, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 80, "cabin": "COACH", "leg": [{"aircraft": "73W", "duration": 80, "origin": "AMS", "mileage": 229, "destinationTerminal": "4", "id": "L4xrJvVAub9Z6RLr", "kind": "qpxexpress#legInfo", "departureTime": "2017-02-23T14:05+01:00", "meal": "Snack or Brunch", "destination": "LHR", "arrivalTime": "2017-02-23T14:25+00:00"}], "bookingCode": "T", "id": "Gf7a6ekBsv4DkDJT", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 9, "marriedSegmentGroup": "0", "flight": {"carrier": "KL", "number": "1019"}}]}], "saleTotal": "EUR75.53"}, {"id": "E4xALyuxnXOLIYn7wHGKfO005", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR52.00", "latestTicketingTime": "2017-02-02T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "Avqz5Oz2yvEq+Z9r2MO5Za+dHIbSnRoZ0dT09CoUNVDk", "segmentId": "GH-m3IFMAHigBWVY"}], "baseFareTotal": "EUR52.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS KL LHR 55.59TWKWNL NUC 55.59 END ROE 0.935287 FARE EUR 52.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "KL", "origin": "AMS", "basisCode": "TWKWNL", "id": "Avqz5Oz2yvEq+Z9r2MO5Za+dHIbSnRoZ0dT09CoUNVDk", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR75.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 80, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 80, "cabin": "COACH", "leg": [{"aircraft": "73W", "duration": 80, "origin": "AMS", "mileage": 229, "destinationTerminal": "4", "id": "LuMeslHrXHwbRpt0", "kind": "qpxexpress#legInfo", "departureTime": "2017-02-23T15:45+01:00", "meal": "Snack or Brunch", "destination": "LHR", "arrivalTime": "2017-02-23T16:05+00:00"}], "bookingCode": "T", "id": "GH-m3IFMAHigBWVY", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 9, "marriedSegmentGroup": "0", "flight": {"carrier": "KL", "number": "1021"}}]}], "saleTotal": "EUR75.53"}, {"id": "E4xALyuxnXOLIYn7wHGKfO009", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR65.00", "latestTicketingTime": "2017-01-29T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "Av0m+4T0gfPWPPwgf+2RMUjrZbH+V/WMYJcsuO7boQrA", "segmentId": "G80z2q6vFhi3qi3u"}], "baseFareTotal": "EUR65.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS BA LON 69.49QV2HO NUC 69.49 END ROE 0.935287 FARE EUR 65.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "BA", "origin": "AMS", "basisCode": "QV2HO", "id": "Av0m+4T0gfPWPPwgf+2RMUjrZbH+V/WMYJcsuO7boQrA", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR88.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 80, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 80, "cabin": "COACH", "leg": [{"aircraft": "320", "duration": 80, "origin": "AMS", "mileage": 229, "destinationTerminal": "5", "id": "LlKQSTYZkyUEt08t", "kind": "qpxexpress#legInfo", "departureTime": "2017-02-23T07:30+01:00", "meal": "Food and Beverages for Purchase", "destination": "LHR", "arrivalTime": "2017-02-23T07:50+00:00"}], "bookingCode": "Q", "id": "G80z2q6vFhi3qi3u", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 6, "marriedSegmentGroup": "0", "flight": {"carrier": "BA", "number": "423"}}]}], "saleTotal": "EUR88.53"}, {"id": "E4xALyuxnXOLIYn7wHGKfO008", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR65.00", "latestTicketingTime": "2017-01-29T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "Av0m+4T0gfPWPPwgf+2RMUjrZbH+V/WMYJcsuO7boQrA", "segmentId": "G5AkwObWJkOpFBc6"}], "baseFareTotal": "EUR65.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS BA LON 69.49QV2HO NUC 69.49 END ROE 0.935287 FARE EUR 65.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "BA", "origin": "AMS", "basisCode": "QV2HO", "id": "Av0m+4T0gfPWPPwgf+2RMUjrZbH+V/WMYJcsuO7boQrA", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR88.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 75, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 75, "cabin": "COACH", "leg": [{"aircraft": "321", "duration": 75, "origin": "AMS", "mileage": 229, "destinationTerminal": "5", "id": "L7gBInJ8AQlYjD-Y", "kind": "qpxexpress#legInfo", "departureTime": "2017-02-23T16:10+01:00", "meal": "Food and Beverages for Purchase", "destination": "LHR", "arrivalTime": "2017-02-23T16:25+00:00"}], "bookingCode": "Q", "id": "G5AkwObWJkOpFBc6", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 8, "marriedSegmentGroup": "0", "flight": {"carrier": "BA", "number": "439"}}]}], "saleTotal": "EUR88.53"}, {"id": "E4xALyuxnXOLIYn7wHGKfO00A", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR65.00", "latestTicketingTime": "2017-01-29T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "Av0m+4T0gfPWPPwgf+2RMUjrZbH+V/WMYJcsuO7boQrA", "segmentId": "GTxfb06FkQUnFyVd"}], "baseFareTotal": "EUR65.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS BA LON 69.49QV2HO NUC 69.49 END ROE 0.935287 FARE EUR 65.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "BA", "origin": "AMS", "basisCode": "QV2HO", "id": "Av0m+4T0gfPWPPwgf+2RMUjrZbH+V/WMYJcsuO7boQrA", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR88.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 80, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 80, "cabin": "COACH", "leg": [{"aircraft": "320", "duration": 80, "origin": "AMS", "mileage": 229, "destinationTerminal": "5", "id": "L9cSW5fHx3M08c51", "kind": "qpxexpress#legInfo", "departureTime": "2017-02-23T14:05+01:00", "meal": "Food and Beverages for Purchase", "destination": "LHR", "arrivalTime": "2017-02-23T14:25+00:00"}], "bookingCode": "Q", "id": "GTxfb06FkQUnFyVd", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 6, "marriedSegmentGroup": "0", "flight": {"carrier": "BA", "number": "435"}}]}], "saleTotal": "EUR88.53"}, {"id": "E4xALyuxnXOLIYn7wHGKfO007", "pricing": [{"passengers": {"adultCount": 1, "kind": "qpxexpress#passengerCounts"}, "saleFareTotal": "EUR65.00", "latestTicketingTime": "2017-01-29T23:59-05:00", "segmentPricing": [{"kind": "qpxexpress#segmentPricing", "fareId": "Av0m+4T0gfPWPPwgf+2RMUjrZbH+V/WMYJcsuO7boQrA", "segmentId": "G0X5FxdiIt0JAMFD"}], "baseFareTotal": "EUR65.00", "saleTaxTotal": "EUR23.53", "fareCalculation": "AMS BA LON 69.49QV2HO NUC 69.49 END ROE 0.935287 FARE EUR 65.00 XT 10.53CJ 13.00RN", "tax": [{"salePrice": "EUR10.53", "code": "CJ", "id": "CJ_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}, {"salePrice": "EUR13.00", "code": "RN", "id": "RN_001", "kind": "qpxexpress#taxInfo", "chargeType": "GOVERNMENT", "country": "NL"}], "fare": [{"carrier": "BA", "origin": "AMS", "basisCode": "QV2HO", "id": "Av0m+4T0gfPWPPwgf+2RMUjrZbH+V/WMYJcsuO7boQrA", "kind": "qpxexpress#fareInfo", "destination": "LON"}], "saleTotal": "EUR88.53", "kind": "qpxexpress#pricingInfo", "ptc": "ADT"}], "kind": "qpxexpress#tripOption", "slice": [{"duration": 75, "kind": "qpxexpress#sliceInfo", "segment": [{"duration": 75, "cabin": "COACH", "leg": [{"aircraft": "32A", "duration": 75, "origin": "AMS", "mileage": 229, "destinationTerminal": "5", "id": "LEufacirrlmtQPpd", "kind": "qpxexpress#legInfo", "departureTime": "2017-02-23T12:00+01:00", "meal": "Food and Beverages for Purchase", "destination": "LHR", "arrivalTime": "2017-02-23T12:15+00:00"}], "bookingCode": "Q", "id": "G0X5FxdiIt0JAMFD", "kind": "qpxexpress#segmentInfo", "bookingCodeCount": 8, "marriedSegmentGroup": "0", "flight": {"carrier": "BA", "number": "431"}}]}], "saleTotal": "EUR88.53"}]}, "kind": "qpxExpress#tripsSearch"}

Я красиво напечатал данные. Для каждого полета я хотел бы, чтобы все ключи были столбцами, а все значения ключей - строками. Пример желаемого вывода (чем больше пар ключ-значение, тем лучше):

fareId, aircraft name, origin, origin name, destination, destination name, carrier code, carrier name, adultCount, saleFareTotal, saleTaxTotal, saleTotal, arrivalTime, departureTime
Av0m+4T0gfPWPPwgf+2RMUjrZbH+V/WMYJcsuO7boQrA, Airbus A320, AMS, Amsterdam Schiphol Airport, LHR, London Heathrow, BA, British Airways, 1, EUR82.00, EUR67.24, EUR149.24, 2017-02-20T22:05+00:00, 2017-02-20T22:00+01:00
Avqz5Oz2yvEq+Z9r2MO5Za+dHIbSnRoZ0dT09CoUNVDk, Boeing 767, AMS, Amsterdam Schiphol Airport, LHR, London Heathrow, BA, British Airways, 1,  EUR82.00, EUR67.24, EUR149.24, 2017-02-23T09:05+01:00, 2017-02-23T06:45+00:00

Я пытаюсь нормализовать эти данные. Использовал множество решений на SO, Google, Youtube. Я попытался загрузить raw_data в кадр данных pandas, сгладить словарь и нормализовать данные следующим образом:

#! python3
import json
import pandas as pd
from pandas.io.json import json_normalize
from pprint import pprint

with open ("jsondata-complex.json", 'r') as f:
    raw_data = json.load(f)
    keys_raw = raw_data.keys()
    pprint(raw_data)


#accessing raw_data
print("\nKeys in raw data: ", keys_raw, "\n\nBased on 'raw' data: \n")
print("Departure: ", raw_data["trips"]["tripOption"][0]["slice"][0]["segment"][0]['leg'][0]['departureTime'])
print("Arrival: ", raw_data["trips"]["tripOption"][0]["slice"][0]["segment"][0]['leg'][0]['arrivalTime'])
print("Carrier: ", raw_data["trips"]["data"]["carrier"][0]["name"])
print("Origin: ", raw_data["trips"]["data"]["city"][0]["name"], "(",raw_data["trips"]["data"]["city"][0]["code"],")")
print("Destination: ", raw_data["trips"]["data"]["city"][1]["name"],"(",raw_data["trips"]["data"]["city"][1]["code"],")")
print("Saletotal: ", raw_data["trips"]["tripOption"][0]["pricing"][0]["saleTotal"])

#fetching all nested keys    
def iteritems_nested(d):
  def fetch (suffixes, v0) :
    if isinstance(v0, dict):
      for k, v in v0.items() :
        for i in fetch(suffixes + [k], v):
          yield i
    else:
      yield (suffixes, v0)

  return fetch([], d)

#joining nested keys '.' and return dict
def flatten_dict(d) :
  return dict( ('.'.join(ks), v) for ks, v in iteritems_nested(d))

#passing raw json
iteritems_nested(raw_data)
flat_data = flatten_dict(raw_data)
keys_flat = flat_data.keys()

#accessing flat_data
print("Keys in flat dict: ", keys_flat, "\n\nBased on 'flat' data: \n")

print("Departure: ", flat_data['trips.tripOption'][0]["slice"][0]["segment"][0]['leg'][0]['departureTime'])
print("Arrival: ", flat_data['trips.tripOption'][0]["slice"][0]["segment"][0]['leg'][0]['arrivalTime'])
print("Carrier: ", flat_data['trips.data.carrier'][0]["name"])
print("Origin: ", flat_data['trips.data.city'][0]["name"], "(",flat_data['trips.data.city'][0]["code"],")")
print("Destination: ", flat_data['trips.data.city'][1]["name"],"(",flat_data['trips.data.city'][1]["code"],")")
print("Saletotal: ",flat_data['trips.tripOption'][0]["pricing"][0]["saleTotal"])

#normalized_raw_data = json_normalize(raw_data['trips'])
#normalized_flat_data = json_normalize(flat_data['trips.tripOption'])
#print(normalized_raw_data)
#print(normalized_flat_data)

Есть ли лучший способ структурировать ответ JSON в столбцах (ключи) и строках (значения)? Кадр данных Pandas не любит flat_data или необработанные данные.

Опять же, любые отзывы приветствуются. Заранее спасибо.

25.01.2017

Ответы:


1

Это должно помочь вам получить желаемые результаты. Я создал класс, помогающий обрабатывать данные, и перебирал каждый полет. У меня есть только некоторые данные, которые вам нужны, но вы можете легко добавить в класс дополнительные атрибуты, чтобы хранить все нужные вам данные.

Важно отметить:

Вам нужно добавить атрибут в функцию __init__, добавить атрибут в функцию to_list и добавить атрибут в список headers. Также имена файлов разные, так как я изменил их для целей тестирования.

import json
import csv

class Flight:
    def __init__(self, plane, data):
        self.name = plane
        self.origin = data["trips"]["data"]["airport"][0]["code"]
        self.origin_name = data["trips"]["data"]["airport"][0]["name"]
        self.destination = data["trips"]["data"]["airport"][1]["code"]
        self.destination_name = data["trips"]["data"]["airport"][1]["name"]

    def to_list(self):
        return [self.name, self.origin, self.origin_name, self.destination, self.destination_name]

with open ("flight.json", 'r') as f:
    raw_data = json.load(f)

out_data = []
for flight in raw_data['trips']['data']['aircraft']:
    out_data.append(Flight(flight['name'], raw_data).to_list())

headers = ['aircraft name', 'origin', 'origin name', 'destination']
with open('results.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    writer.writerow(headers)
    writer.writerows(out_data)

Выход:

aircraft name,origin,origin name,destination
Airbus A320,AMS,Amsterdam Schiphol Airport,LHR,London Heathrow
Airbus A321,AMS,Amsterdam Schiphol Airport,LHR,London Heathrow
Boeing 767,AMS,Amsterdam Schiphol Airport,LHR,London Heathrow
25.01.2017
  • Большое спасибо за ваш ответ и усилия. Интересный подход. Добавил некоторые атрибуты к функциям и заголовкам, и это заработало как шарм в оригинальном JSON-файле. Недостатком является то, что с другим выводом (больше рейсов) код больше не работает должным образом. Я попробую еще раз завтра. Я одобрил ваш ответ, но моя оценка репутации недостаточно высока, чтобы публично повлиять на оценку публикации. 25.01.2017
  • Если бы вы могли показать другие результаты, сценарий можно было бы изменить. 25.01.2017
  • Спасибо. Я обновил вывод. В нем мы должны найти 10 разных тарифов. Все с AMS отправления и LHR назначения, НО с разным временем прибытия. Я хочу соответствующим образом перечислить эти рейсы и сделать код таким, чтобы он был достаточно гибким для изменений в выводе. 26.01.2017
  • Сценарий, который я изначально написал, даст вам набор самолетов, доступных для поездок. Для второй части вы можете написать второй скрипт, который перебирает не самолеты, а варианты поездки for trip in raw_data['tripOption']. Вы можете создать класс для каждого Trip и сопоставить самолеты на основе кода самолета. 26.01.2017
  • Хорошо, я попробую. Я ищу обзор различных тарифов с указанием соответствующего перевозчика, пункта отправления, пункта назначения, времени прибытия, времени отправления, общей цены (эти значения не являются постоянными, т. Е. Они разные для каждой поездки). Если я перебираю варианты поездки, будет ли сценарий учитывать эти значения переменных? В любом случае, спасибо за ваш пост, я приму его как ответ. 26.01.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..