Hi i am trying to denormalize/flatten a JSON to dictionary, in the following i have a generic way of flattening the JSON, the function below somehow dose not take care of nested JSON. The Goal is to flatten the nested dict/json to a CSV compatible objects.
I've used the following code:
def flatten(s):
for i in s:
if not isinstance(s[i], dict):
yield (i, s[i])
else:
for b in flatten(s[i]):
yield b
new_data = dict(list(flatten(mydict)))
print(new_data)
With this input dictionary
mydict = "{
'G_TRANSACTIONS': {
'INVOICE_NUMBER': '31002',
'TRANSACTION_CLASS': 'Invoice',
'LIST_G_LINES': {
'G_LINES': [
{
'LN_LINE_NUMBER': '1',
'LN_LINE_TYPE': 'Line',
'LN_DESCRIPTION': 'PKG980N-MAIN STREET 16C POCKET PLUGS',
'LN_UNIT_OF_MEASURE': 'EA',
'LN_QUANTITY': '3',
'LN_NET_SELLING_PRICE': '200',
'LN_NET_EXTENDED_AMOUNT': '600',
'LIST_G_LINES_ITEM_NUMBER': {
'G_LINES_ITEM_NUMBER': {
'ITEM_NUMBER': '136864001'
}
}
},
{
'LN_LINE_NUMBER': '1',
'LN_LINE_TYPE': 'Other Line',
'LN_DESCRIPTION': 'Johar Town Lahore',
'LN_UNIT_OF_MEASURE': 'EA',
'LN_QUANTITY': '3',
'LN_NET_SELLING_PRICE': '200',
'LN_NET_EXTENDED_AMOUNT': '999',
'LIST_G_LINES_ITEM_NUMBER': {
'G_LINES_ITEM_NUMBER': {
'ITEM_NUMBER': '99999999'
}
}
}
]
},
'TR_LN_AMOUNT': '600'
}
}"
they output i get is:
{
'INVOICE_NUMBER': '31002',
'TRANSACTION_CLASS': 'Invoice',
'G_LINES': [
{
'LN_LINE_NUMBER': '1',
'LN_LINE_TYPE': 'Line',
'LN_DESCRIPTION': 'PKG980N-MAIN STREET 16C POCKET PLUGS',
'LN_UNIT_OF_MEASURE': 'EA',
'LN_QUANTITY': '3',
'LN_NET_SELLING_PRICE': '200',
'LN_NET_EXTENDED_AMOUNT': '600',
'LIST_G_LINES_ITEM_NUMBER': {
'G_LINES_ITEM_NUMBER': {
'ITEM_NUMBER': '136864001'
}
}
},
{
'LN_LINE_NUMBER': '1',
'LN_LINE_TYPE': 'Other Line',
'LN_DESCRIPTION': 'Johar Town Lahore',
'LN_UNIT_OF_MEASURE': 'EA',
'LN_QUANTITY': '3',
'LN_NET_SELLING_PRICE': '200',
'LN_NET_EXTENDED_AMOUNT': '999',
'LIST_G_LINES_ITEM_NUMBER': {
'G_LINES_ITEM_NUMBER': {
'ITEM_NUMBER': '99999999'
}
}
}
],
'TR_LN_AMOUNT': '600'
}
Desired Output
{
'INVOICE_NUMBER': '31002',
'TRANSACTION_CLASS': 'Invoice',
'LN_LINE_NUMBER': '1',
'LN_LINE_TYPE': 'Line',
'LN_DESCRIPTION': 'PKG980N-MAIN STREET 16C POCKET PLUGS',
'LN_UNIT_OF_MEASURE': 'EA',
'LN_QUANTITY': '3',
'LN_NET_SELLING_PRICE': '200',
'LN_NET_EXTENDED_AMOUNT': '600',
'ITEM_NUMBER': '136864001',
'TR_LN_AMOUNT': '600'
}
,
{
'INVOICE_NUMBER': '31002',
'TRANSACTION_CLASS': 'Invoice',
'LN_LINE_NUMBER': '1',
'LN_LINE_TYPE': 'Other Line',
'LN_DESCRIPTION': 'Johar Town Lahore',
'LN_UNIT_OF_MEASURE': 'EA',
'LN_QUANTITY': '3',
'LN_NET_SELLING_PRICE': '200',
'LN_NET_EXTENDED_AMOUNT': '999',
'ITEM_NUMBER': '99999999',
'TR_LN_AMOUNT': '600'
}