Added 2 so questions test cases.
This commit is contained in:
parent
775df0efa8
commit
e55c542db2
|
@ -0,0 +1,35 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
class stackoverflow_question_60066331_test_case(unittest.TestCase):
|
||||
|
||||
def test_stackoverflow_question_60066331(self):
|
||||
"""
|
||||
https://stackoverflow.com/questions/60066331/find-elements-in-python-dict
|
||||
"""
|
||||
from benedict import benedict as bdict
|
||||
|
||||
d = bdict({
|
||||
'ResponseMetadata': {
|
||||
'NOT IMPORTANT'
|
||||
},
|
||||
'hasMoreResults': True,
|
||||
'marker': '{"NOT IMPORTANT"}',
|
||||
'pipelineIdList': [
|
||||
{'id': 'df-0001', 'name': 'Blue' },
|
||||
{'id': 'df-0002', 'name': 'Orange'},
|
||||
{'id': 'df-0003', 'name': 'Green'},
|
||||
{'id': 'df-0004', 'name': 'Red'},
|
||||
{'id': 'df-0005', 'name': 'Purple'}
|
||||
]
|
||||
})
|
||||
results = d.search('red', in_keys=False, in_values=True, exact=True, case_sensitive=False)
|
||||
# for item, key, value in results:
|
||||
# print(item) # {'id': 'df-0004', 'name': 'Red'}
|
||||
# print(key) # 'name'
|
||||
# print(value) # 'Red'
|
||||
|
||||
self.assertEqual(len(results), 1)
|
||||
self.assertEqual(results[0], ({'id': 'df-0004', 'name': 'Red'}, 'name', 'Red', ))
|
|
@ -0,0 +1,747 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
class stackoverflow_question_60072709_test_case(unittest.TestCase):
|
||||
|
||||
def test_stackoverflow_question_60072709(self):
|
||||
"""
|
||||
https://stackoverflow.com/questions/60072709/i-want-to-convert-sample-json-data-into-nested-json-using-specific-key-value-in
|
||||
"""
|
||||
from benedict import benedict as bdict
|
||||
|
||||
json_input = """
|
||||
{
|
||||
"1": {
|
||||
"amount": 0,
|
||||
"breakdown": [
|
||||
{
|
||||
"amount": 169857,
|
||||
"id": 4,
|
||||
"name": "Website Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 8709,
|
||||
"id": 5,
|
||||
"name": "Mobile App Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 80862,
|
||||
"id": 6,
|
||||
"name": "DevOps",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 51479,
|
||||
"id": 7,
|
||||
"name": "Wireframing",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 37204,
|
||||
"id": 8,
|
||||
"name": "UI Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 13141,
|
||||
"id": 9,
|
||||
"name": "Brochure Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 39591,
|
||||
"id": 10,
|
||||
"name": "Social Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 41385,
|
||||
"id": 11,
|
||||
"name": "Print Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 92801,
|
||||
"id": 12,
|
||||
"name": "Payment Gateway License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 77056,
|
||||
"id": 13,
|
||||
"name": "JavaScript Plugin License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 3412,
|
||||
"id": 14,
|
||||
"name": "Google Play Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 5297,
|
||||
"id": 15,
|
||||
"name": "Apple App Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 75020,
|
||||
"id": 16,
|
||||
"name": "Servers",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 1217,
|
||||
"id": 17,
|
||||
"name": "Domain Name",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 4625,
|
||||
"id": 18,
|
||||
"name": "SSL Certificate",
|
||||
"parent_id": "6"
|
||||
}
|
||||
],
|
||||
"id": 1,
|
||||
"name": "Project 1"
|
||||
},
|
||||
"2": {
|
||||
"amount": 0,
|
||||
"breakdown": [
|
||||
{
|
||||
"amount": 205822,
|
||||
"id": 4,
|
||||
"name": "Website Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 12132,
|
||||
"id": 5,
|
||||
"name": "Mobile App Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 56235,
|
||||
"id": 6,
|
||||
"name": "DevOps",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 72901,
|
||||
"id": 7,
|
||||
"name": "Wireframing",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 33750,
|
||||
"id": 8,
|
||||
"name": "UI Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 10547,
|
||||
"id": 9,
|
||||
"name": "Brochure Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 53946,
|
||||
"id": 10,
|
||||
"name": "Social Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 38910,
|
||||
"id": 11,
|
||||
"name": "Print Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 131750,
|
||||
"id": 12,
|
||||
"name": "Payment Gateway License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 74072,
|
||||
"id": 13,
|
||||
"name": "JavaScript Plugin License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 2585,
|
||||
"id": 14,
|
||||
"name": "Google Play Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 9547,
|
||||
"id": 15,
|
||||
"name": "Apple App Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 50087,
|
||||
"id": 16,
|
||||
"name": "Servers",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 1463,
|
||||
"id": 17,
|
||||
"name": "Domain Name",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 4685,
|
||||
"id": 18,
|
||||
"name": "SSL Certificate",
|
||||
"parent_id": "6"
|
||||
}
|
||||
],
|
||||
"id": 2,
|
||||
"name": "Project 2"
|
||||
},
|
||||
"3": {
|
||||
"amount": 0,
|
||||
"breakdown": [
|
||||
{
|
||||
"amount": 253894,
|
||||
"id": 4,
|
||||
"name": "Website Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 11924,
|
||||
"id": 5,
|
||||
"name": "Mobile App Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 54651,
|
||||
"id": 6,
|
||||
"name": "DevOps",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 82045,
|
||||
"id": 7,
|
||||
"name": "Wireframing",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 46000,
|
||||
"id": 8,
|
||||
"name": "UI Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 9835,
|
||||
"id": 9,
|
||||
"name": "Brochure Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 45660,
|
||||
"id": 10,
|
||||
"name": "Social Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 25984,
|
||||
"id": 11,
|
||||
"name": "Print Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 162184,
|
||||
"id": 12,
|
||||
"name": "Payment Gateway License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 91710,
|
||||
"id": 13,
|
||||
"name": "JavaScript Plugin License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 2596,
|
||||
"id": 14,
|
||||
"name": "Google Play Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 9328,
|
||||
"id": 15,
|
||||
"name": "Apple App Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 48171,
|
||||
"id": 16,
|
||||
"name": "Servers",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 1550,
|
||||
"id": 17,
|
||||
"name": "Domain Name",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 4930,
|
||||
"id": 18,
|
||||
"name": "SSL Certificate",
|
||||
"parent_id": "6"
|
||||
}
|
||||
],
|
||||
"id": 3,
|
||||
"name": "Project 3"
|
||||
},
|
||||
"4": {
|
||||
"amount": 0,
|
||||
"breakdown": [
|
||||
{
|
||||
"amount": 215166,
|
||||
"id": 4,
|
||||
"name": "Website Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 11030,
|
||||
"id": 5,
|
||||
"name": "Mobile App Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 60883,
|
||||
"id": 6,
|
||||
"name": "DevOps",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 82842,
|
||||
"id": 7,
|
||||
"name": "Wireframing",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 26713,
|
||||
"id": 8,
|
||||
"name": "UI Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 13305,
|
||||
"id": 9,
|
||||
"name": "Brochure Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 47650,
|
||||
"id": 10,
|
||||
"name": "Social Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 41266,
|
||||
"id": 11,
|
||||
"name": "Print Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 130015,
|
||||
"id": 12,
|
||||
"name": "Payment Gateway License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 85151,
|
||||
"id": 13,
|
||||
"name": "JavaScript Plugin License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 2341,
|
||||
"id": 14,
|
||||
"name": "Google Play Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 8689,
|
||||
"id": 15,
|
||||
"name": "Apple App Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 55320,
|
||||
"id": 16,
|
||||
"name": "Servers",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 1399,
|
||||
"id": 17,
|
||||
"name": "Domain Name",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 4164,
|
||||
"id": 18,
|
||||
"name": "SSL Certificate",
|
||||
"parent_id": "6"
|
||||
}
|
||||
],
|
||||
"id": 4,
|
||||
"name": "Project 4"
|
||||
},
|
||||
"5": {
|
||||
"amount": 0,
|
||||
"breakdown": [
|
||||
{
|
||||
"amount": 257678,
|
||||
"id": 4,
|
||||
"name": "Website Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 11908,
|
||||
"id": 5,
|
||||
"name": "Mobile App Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 69707,
|
||||
"id": 6,
|
||||
"name": "DevOps",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 80342,
|
||||
"id": 7,
|
||||
"name": "Wireframing",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 25483,
|
||||
"id": 8,
|
||||
"name": "UI Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 12735,
|
||||
"id": 9,
|
||||
"name": "Brochure Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 47972,
|
||||
"id": 10,
|
||||
"name": "Social Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 39871,
|
||||
"id": 11,
|
||||
"name": "Print Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 133534,
|
||||
"id": 12,
|
||||
"name": "Payment Gateway License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 124144,
|
||||
"id": 13,
|
||||
"name": "JavaScript Plugin License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 2083,
|
||||
"id": 14,
|
||||
"name": "Google Play Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 9825,
|
||||
"id": 15,
|
||||
"name": "Apple App Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 63413,
|
||||
"id": 16,
|
||||
"name": "Servers",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 1437,
|
||||
"id": 17,
|
||||
"name": "Domain Name",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 4857,
|
||||
"id": 18,
|
||||
"name": "SSL Certificate",
|
||||
"parent_id": "6"
|
||||
}
|
||||
],
|
||||
"id": 5,
|
||||
"name": "Project 5"
|
||||
},
|
||||
"6": {
|
||||
"amount": 0,
|
||||
"breakdown": [
|
||||
{
|
||||
"amount": 202257,
|
||||
"id": 4,
|
||||
"name": "Website Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 11990,
|
||||
"id": 5,
|
||||
"name": "Mobile App Development",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 67792,
|
||||
"id": 6,
|
||||
"name": "DevOps",
|
||||
"parent_id": "1"
|
||||
},
|
||||
{
|
||||
"amount": 78702,
|
||||
"id": 7,
|
||||
"name": "Wireframing",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 32707,
|
||||
"id": 8,
|
||||
"name": "UI Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 10431,
|
||||
"id": 9,
|
||||
"name": "Brochure Design",
|
||||
"parent_id": "2"
|
||||
},
|
||||
{
|
||||
"amount": 28636,
|
||||
"id": 10,
|
||||
"name": "Social Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 43055,
|
||||
"id": 11,
|
||||
"name": "Print Media Marketing",
|
||||
"parent_id": "3"
|
||||
},
|
||||
{
|
||||
"amount": 101200,
|
||||
"id": 12,
|
||||
"name": "Payment Gateway License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 101057,
|
||||
"id": 13,
|
||||
"name": "JavaScript Plugin License",
|
||||
"parent_id": "4"
|
||||
},
|
||||
{
|
||||
"amount": 3081,
|
||||
"id": 14,
|
||||
"name": "Google Play Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 8909,
|
||||
"id": 15,
|
||||
"name": "Apple App Store Fees",
|
||||
"parent_id": "5"
|
||||
},
|
||||
{
|
||||
"amount": 60790,
|
||||
"id": 16,
|
||||
"name": "Servers",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 1612,
|
||||
"id": 17,
|
||||
"name": "Domain Name",
|
||||
"parent_id": "6"
|
||||
},
|
||||
{
|
||||
"amount": 5390,
|
||||
"id": 18,
|
||||
"name": "SSL Certificate",
|
||||
"parent_id": "6"
|
||||
}
|
||||
],
|
||||
"id": 6,
|
||||
"name": "Project 6"
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
json_output = """
|
||||
[
|
||||
{
|
||||
|
||||
"id": 1,
|
||||
"name": "Project 1",
|
||||
"amount": 442228,
|
||||
"breakdown": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Development",
|
||||
"amount": 259428,
|
||||
"breakdown": [
|
||||
{
|
||||
"id": 4,
|
||||
"name": "Website Development",
|
||||
"amount": 169857,
|
||||
"breakdown": [
|
||||
{
|
||||
"id": 12,
|
||||
"name": "Payment Gateway License",
|
||||
"amount": 92801,
|
||||
"breakdown": []
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"name": "JavaScript Plugin License",
|
||||
"amount": 77056,
|
||||
"breakdown": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "Mobile App Development",
|
||||
"amount": 8709,
|
||||
"breakdown": [
|
||||
{
|
||||
"id": 14,
|
||||
"name": "Google Play Store Fees",
|
||||
"amount": 3412,
|
||||
"breakdown": []
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"name": "Apple App Store Fees",
|
||||
"amount": 5297,
|
||||
"breakdown": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"name": "DevOps",
|
||||
"amount": 80862,
|
||||
"breakdown": [
|
||||
{
|
||||
"id": 16,
|
||||
"name": "Servers",
|
||||
"amount": 75020,
|
||||
"breakdown": []
|
||||
},
|
||||
{
|
||||
"id": 17,
|
||||
"name": "Domain Name",
|
||||
"amount": 1217,
|
||||
"breakdown": []
|
||||
},
|
||||
{
|
||||
"id": 18,
|
||||
"name": "SSL Certificate",
|
||||
"amount": 4625,
|
||||
"breakdown": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Designing",
|
||||
"amount": 101824,
|
||||
"breakdown": [
|
||||
{
|
||||
"id": 7,
|
||||
"name": "Wireframing",
|
||||
"amount": 51479,
|
||||
"breakdown": []
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"name": "UI Design",
|
||||
"amount": 37204,
|
||||
"breakdown": []
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"name": "Brochure Design",
|
||||
"amount": 13141,
|
||||
"breakdown": []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Marketing",
|
||||
"amount": 80976,
|
||||
"breakdown": [
|
||||
{
|
||||
"id": 10,
|
||||
"name": "Social Media Marketing",
|
||||
"amount": 39591,
|
||||
"breakdown": []
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"name": "Print Media Marketing",
|
||||
"amount": 41385,
|
||||
"breakdown": []
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
]
|
||||
}
|
||||
]
|
||||
"""
|
||||
|
||||
data = bdict.from_json(json_input)
|
||||
keys = list(data.keys())
|
||||
items = []
|
||||
for key in keys:
|
||||
item = bdict(data.get(key))
|
||||
# move all items to the top level
|
||||
items += list(item['breakdown'])
|
||||
item['breakdown'] = []
|
||||
items.append(item)
|
||||
break
|
||||
|
||||
# convert all parent_id values to int to allow comparison
|
||||
for item in items:
|
||||
if 'parent_id' in item:
|
||||
item['parent_id'] = int(item['parent_id'])
|
||||
|
||||
items_dict = bdict({ 'items':items })
|
||||
items_dict['items_nested'] = items_dict.nest('items', id_key='id', parent_id_key='parent_id', children_key='breakdown')
|
||||
# print(items_dict.dump())
|
Loading…
Reference in New Issue