I have the following convoluted JSON and I'm trying to figure out an efficient way to parse it and then store it (desirable to be directly written into a PostgreSQL db):
{'rfqNoticeId': 100100261,
'isUtilityContract': False,
'caNoticeEdit_New': {'publicationDetailsModel': {'caPublicationDate': '2020-09-01T15:02:32+03:00',
'publicationDate': '2020-04-14T09:41:17+03:00',
'jouePublicationNumber': '',
'noticeNo': 'SCN1066717'},
'section0_New': {'sentToJOUE': False,
'tedNoticeNo': None,
'completeTedModel': {'caNoticeId': 0,
'ojeuNoticeNoYear': None,
'ojeuNoticeNoSecondPart': None,
'ojeuNoticeNoThirdPart': None,
'ojeuNoticeDate': None},
'canEdit': False,
'caNoticeId': 0,
'sectionName': None,
'sectionCode': None,
'noticePreviousPublication': None},
'section1_New': {'section1_1': {'caAddress': {'noticeId': 100389891,
'officialName': 'MUNICIPIUL MANGALIA',
'address': 'Strada: Sos Constantei , nr. 13',
'city': 'Mangalia',
'cityItem': {'id': 7200, 'text': 'Mangalia', 'localeKey': ''},
'postalCode': '905500',
'postalCodeItem': None,
'countryID': 1,
'country': 'Romania',
'countryItem': {'id': 1, 'text': 'Romania', 'localeKey': 'RO'},
'county': {'id': 15, 'text': 'Constanta', 'localeKey': 'CT'},
'email': '[email protected]',
'phone': '+40 241751060',
'fax': '+40 241755606',
'contactPoints': 'CALIN DIDI GEORGE',
'attentionTo': 'CALIN DIDI GEORGE',
'caMainAddressUrl': 'www.mangalia.ro',
'buyerProfileUrl': 'www.e-licitatie.ro',
'nutsCodeID': 28,
'nutsCode': 'System.Data.Entity.DynamicProxies.NUTSCode_547C7532A1C13D2DD8DABA397AFE64934E6300F80287E631C82996E76CE950EB',
'nutsCodeItem': {'id': 28, 'text': 'RO223 Constanta', 'localeKey': None},
'contactPerson': 'CALIN DIDI GEORGE',
'internetAddressesUrl': ['www.mangalia.ro'],
'electronicInfoAccessUrl': None,
'electronicDocumentsSendingUrl': None,
'isSME': False,
'sysNoticeEntityTypeID': 1,
'noticeEntityAddressId': 101882964,
'entityId': 2085,
'entityItem': None,
'isPublishingAgreed': None,
'nationalIDNumber': '4515255'},
'canEdit': False,
'caNoticeId': 100157051,
'sectionName': None,
'sectionCode': None,
'noticePreviousPublication': None},
'section1_2_New': {'isCommonProcurement': False,
'commonProcurementLaw': None,
'isAwardedByCentralAcquisitionOrgan': False,
'otherCANoticeAdresses': [],
'canEdit': False,
'caNoticeId': 100157051,
'sectionName': None,
'sectionCode': None,
'noticePreviousPublication': None},
'section1_4_New': {'caTypeId': 10,
'caType': {'id': 10,
'text': 'Autoritatea regională sau locală',
'localeKey': 'Common.Clasiff.ContractingAuthorityType.RegionalOrLocalAuthority'},
'ifOthersThenSpecify': None,
'caNoticeId': 100157051,
'sectionName': None,
'sectionCode': None,
'noticePreviousPublication': None},
'section1_5': {'mainActivityId': 1,
'mainActivity': {'id': 1,
'text': 'Servicii generale ale administratiilor publice',
'localeKey': 'Common.Clasiff.ActivityType.GeneralPublicServices'},
'ifOthersThenSpecify': None,
'caNoticeId': 100157051,
'sectionName': None,
'sectionCode': None,
'noticePreviousPublication': None}},
'section2_New': {'section2_1_New': {'contractTitle': 'Servicii de proiectare privind realizarea Pth, DE, PAC, POE, documentatii tehnice necesare in vederea obtinerii avizelor/ acordurilor/ autorizatiilor si asistenta tehnica din partea proiectantului pentru realizarea investiţiei pentru obiectivul de investitii cu titlul “Extindere si dotare ambulatoriu, Spital Municipal Mangalia”',
'referenceNumber': '4515255_2020_PAAPD1136420',
'mainCPVCode': {'id': 18143,
'text': 'Servicii de proiectare tehnica pentru constructia de lucrari publice (Rev.2)',
'localeKey': '71322000-1'},
'sysAcquisitionContractType': {'id': 2,
'text': 'Servicii',
'localeKey': 'Common.Clasiff.SysAcquisitionContractType.Services'},
'shortDescription': 'Se vor presta in conformitate cu cerintele Studiului de Fezabilitate - Servicii de proiectare privind realizarea Pth, DE, PAC, POE, documentatii tehnice necesare in vederea obtinerii avizelor/ acordurilor/ autorizatiilor si asistenta tehnica din partea proiectantului pentru realizarea investiţiei pentru obiectivul de investitii cu titlul “Extindere si dotare ambulatoriu, Spital Municipal Mangalia”, astfel:\n1.\tDocumentatiile tehnice necesare in vederea obtinerii avizelor/acordurilor/autorizatiilor\n2.\tProiect tehnic si detalii de executie\n3.\tAsistenta tehnica din partea proiectantului pe perioada de executie a lucrarilor si la fazele determinante.\n\nValoarea estimata pentru serviciile de proiectare ce fac obiectul contractului este formata din:\nCap. 3.5.4. - Valoarea estimata - Documentatiile tehnice necesare in vederea obtinerii avizelor/acordurilor/autorizatiilor: 0 lei fara TVA;\nCap. 3.5.6. - Valoarea estimata - Proiect tehnic si detalii de executie: 130.000,00 lei fara TVA;\nCap. 3.8.1. - Valoarea estimata - Asistenta tehnica din partea proiectantului: 64.675,90 lei fara TVA;\nValoarea estimata fara TVA: 194.675,90\t \tMonedă: RON\nAtentie: Termenul in care autoritatea contractanta va raspunde in mod clar si complet tuturor solicitarilor de clarificari sau informatii suplimentare este de 3 zile inainte de data limita de depunere a ofertelor, in masura in care aceste solicitari vor fi adresate in termenul prevazut la sectiunea I din Fisa de Date/ Instructiunile pentru orfertanti, respectiv 6 zile inainte de data limita de depunere a ofertelor.',
'hasLots': False,
'numberOfLots': None,
'shouldShowSection217': True,
'totalAcquisitionValue': 78000.0,
'totalRONAcquisitionValueForPAAP': 78000.0,
'lowestOffer': 0.0,
'highestOffer': 0.0,
'currency': {'id': 1, 'text': 'Leu', 'localeKey': 'RON'},
'canEdit': False,
'caNoticeId': 100157051,
'sectionName': None,
'sectionCode': None,
'noticePreviousPublication': None},
'section2_2_New': {'showPublishingAgreedSection': False,
'previousPublication': True,
'descriptionList': [{'noticeLotID': 101033604,
'contractTitle': 'Default lot',
'lotNumber': '1',
'mainCPVCodes': {'id': 18143,
'text': '71322000-1 Servicii de proiectare tehnica pentru constructia de lucrari publice (Rev.2)',
'localeKey': None},
'secondaryCPVCodes': [],
'nutsCode': {'id': 11740, 'text': 'RO223 Constanţa', 'localeKey': None},
'mainLocation': 'Municipiul Mangalia',
'shortDescription': 'Se vor presta in conformitate cu cerintele Studiului de Fezabilitate - Servicii de proiectare privind realizarea Pth, DE, PAC, POE, documentatii tehnice necesare in vederea obtinerii avizelor / acordurilor / autorizatiilor si asistenta tehnica din partea proiectantului pentru realizarea investiţiei pentru obiectivul de investitii cu titlul “Extindere si dotare ambulatoriu, Spital Municipal Mangalia”, astfel: \n1.\tDocumentatiile tehnice necesare in vederea obtinerii avizelor/acordurilor/autorizatiilor\n2.\tProiect tehnic si detalii de executie\n3.\tAsistenta tehnica din partea proiectantului pe perioada de executie a lucrarilor si la fazele determinante.\n\nPotrivit devizului general realizat la faza de SF, valoarea estimata pentru serviciile de proiectare ce fac obiectul contractului este formata din: \nCap. 3.5.4. - Valoarea estimata - Documentatiile tehnice necesare in vederea obtinerii avizelor/acordurilor/autorizatiilor: 0 lei fara TVA
\nCap. 3.5.6. - Valoarea estimata - Proiect tehnic si detalii de executie: 130.000, 00 lei fara TVA
\nCap. 3.8.1. - Valoarea estimata - Asistenta tehnica din partea proiectantului: 64.675, 90 lei fara TVA
\nValoarea estimata fara TVA: 194.675, 90\t
\tMonedă: RON',
'noticeAwardCriteriaList': [{'noticeAwardCriteriaID': 100280421,
'noticeAwardCriteriaName': 'Pretul ofertei',
'noticeAwardCriteriaDescription': 'Componenta financiara',
'noticeAwardCriteriaWeight': 70.0,
'noticeAwardCriteriaOrder': 1,
'algorithmDescription': 'Punctajul se acorda astfel: a) Pentru cel mai scazut dintre preturi se acorda punctajul maxim alocat; b) Pentru celelalte preturi ofertate punctajul P(n) se calculeaza proportional, astfel: P(n) = (Pret minim ofertat / Pret n) x punctaj maxim alocat.',
'isElectronicCriteria': False,
'isPriceCriteria': True,
'isFrameworkAgreementCriteria': False,
'directProportional': None,
'sysAwardCriteriaTypeId': None},
{'noticeAwardCriteriaID': 100280420,
'noticeAwardCriteriaName': '1. Inginer proiectant constructii noi/modernizare/reabilitare/extindere aferente constructiilor civile',
'noticeAwardCriteriaDescription': 'Inginer proiectant constructii noi/modernizare/reabilitare/extindere aferente constructiilor civile: participarea expertului propus in calitate de Inginer proiectant de constructii noi / modernizare / reabilitare / extindere aferente constructiilor civile in cadrul unor contracte de servicii de proiectare la nivelul carora sa fi desfasurat respectivele activitati, privind elaborarea si/sau actualizarea si/sau revizuirea de proiecte tehnice pentru constructii noi / modernizare / reabilitare / extindere aferente constructiilor civile.',
'noticeAwardCriteriaWeight': 10.0,
'noticeAwardCriteriaOrder': 2,
'algorithmDescription': 'Inginer proiectant de construcții civile, industriale si agricole participarea expertului propus in cadrul unor contracte de proiectare la nivelul carora sa fi desfasurat respectivele activitati, privind elaborarea si/sau actualizarea si/sau revizuirea de proiecte tehnice pentru constructii noi / modernizare / reabilitare / extindere aferente constructiilor civile, in cadrul carora sa fi ocupat pozitia de Inginer proiectant de construcții civileindustriale si agricole, se va puncta astfel:\n- pentru 2-3 proiecte/contracte la care a participat - 2 puncte\n- pentru 4-5 proiecte/contracte la care a participat- 5 puncte\n- peste 5 proiecte/contracte la care a participat- 10 puncte',
'isElectronicCriteria': None,
'isPriceCriteria': None,
'isFrameworkAgreementCriteria': None,
'directProportional': None,
'sysAwardCriteriaTypeId': None},
{'noticeAwardCriteriaID': 100280419,
'noticeAwardCriteriaName': '2. Inginer instalații pentru constructii',
'noticeAwardCriteriaDescription': 'Inginer instalații penru constructii: participarea expertului propus in calitate de Inginer instalatii pentru constructii in cadrul unor contracte de proiectare la nivelul carora sa fi desfasurat respectivele activitati, privind elaborarea si/sau actualizarea si/sau revizuirea de proiecte tehnice pentru constructii noi / modernizare / reabilitare / extindere aferente constructiilor civile.',
'noticeAwardCriteriaWeight': 10.0,
'noticeAwardCriteriaOrder': 3,
'algorithmDescription': 'Inginer instalații penru constructii: participarea expertului propus in calitate de Inginer instalatii pentru constructii in cadrul unor contracte de proiectare la nivelul carora sa fi desfasurat respectivele activitati, privind elaborarea si/sau actualizarea si/sau revizuirea de proiecte tehnice pentru constructii noi / modernizare / reabilitare / extindere aferente constructiilor civile,se va puncta astfel:\n- pentru 2-3 proiecte/contracte la care a participat - 2 puncte\n- pentru 4-5 proiecte/contracte la care a participat- 5 puncte\n- peste 5 proiecte/contracte la care a participat- 10 puncte',
'isElectronicCriteria': None,
'isPriceCriteria': None,
'isFrameworkAgreementCriteria': None,
'directProportional': None,
'sysAwardCriteriaTypeId': None},
{'noticeAwardCriteriaID': 100280418,
'noticeAwardCriteriaName': '3. Arhitect',
'noticeAwardCriteriaDescription': 'Arhitect: participarea expertului propus in calitate de Arhitect in cadrul unor contracte de proiectare la nivelul carora sa fi desfasurat respectivele activitati, privind elaborarea si/sau actualizarea si/sau revizuirea de proiecte tehnice pentru constructii noi / modernizare / reabilitare / extindere aferente constructiilor civile.',
'noticeAwardCriteriaWeight': 10.0,
'noticeAwardCriteriaOrder': 4,
'algorithmDescription': 'Arhitect: participarea expertului propus in calitate de Arhitect in cadrul unor contracte de proiectare la nivelul carora sa fi desfasurat respectivele activitati, privind elaborarea si/sau actualizarea si/sau revizuirea de proiecte tehnice pentru constructii noi / modernizare / reabilitare / extindere aferente constructiilor civile,se va puncta astfel:\n- pentru 2-3 proiecte/contracte la care a participat - 2 puncte\n- pentru 4-5 proiecte/contracte la care a participat- 5 puncte\n- peste 5 proiecte/contracte la care a participat- 10 puncte',
'isElectronicCriteria': None,
'isPriceCriteria': None,
'isFrameworkAgreementCriteria': None,
'directProportional': None,
'sysAwardCriteriaTypeId': None}],
'hasOptions': False,
'optionsDescription': None,
'isEUFunded': True,
'euProject': 'POR/2018/8/8.1/8.1.A/1/7 regiuni - Ambulatorii\nAxa Prioritara - Dezvoltarea infrastructurii de sanatate si sociale\nOperatiunea - 8.1.A : Ambulatorii',
'supplementaryInformation': None,
'monthDuration': 26,
'dayDuration': None,
'startDate': None,
'completionDate': None,
'showSysAwardCriteriaType': True,
'sysAwardCriteriaTypeId': 2,
'sysAwardCriteriaType': {'id': 2,
'text': 'Cel mai bun raport calitate – pret',
'localeKey': None},
'sysEuropeanFundId': None,
'sysEuropeanFund': {'id': 3,
'text': 'Programul Operational Regional - POR',
'localeKey': None},
'sysFinancingTypeId': None,
'sysFinancingType': {'id': 4,
'text': 'Program / Proiect',
'localeKey': None},
'communityProgramReference': 'POR/2018/8/8.1/8.1.A/1/7 regiuni - Ambulatorii\nAxa Prioritara - Dezvoltarea infrastructurii de sanatate si sociale\nOperatiunea - 8.1.A : Ambulatorii',
'estimatedValue': None,
'minEstimatedValue': None,
'maxEstimatedValue': None,
'currency': None,
'lotInfo': None}],
'canEdit': False,
'caNoticeId': 100157051,
'sectionName': None,
'sectionCode': None,
'noticePreviousPublication': None}},
I tried something like this for another JSON format
def parser(data):
d = json.loads(data)
if ('Eroare de sistem' in data) & ('Object reference not set' in data):
return None
else:
return json_normalize(d,
record_path='directAcquisitionItems',
meta=format,
errors='ignore',
meta_prefix='main_'
record_prefix='lot_'
)
resulting in small dataframe objects that I can write into a CSV, but the process is very slow.