Python Forum
Retrieving items from JSON - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Retrieving items from JSON (/thread-22013.html)

Pages: 1 2


Retrieving items from JSON - bazcurtis - Oct-24-2019

Hi,

I am very new to Python and I apologise if I am asking this wrong. I have retrieved a list of tenants via the API I am trying to use. I need to retrieve the ID, Name and Region from the result. I have 10 tenants.

I managed to do this earlier in my code, but that didn't returned any items, just a set of tokens that were easy to retrieve. How do I get just the tokens I want from this list? Below is my code

r = requests.get(tenants_url, headers=headers)
tenants = r.json()
If I look in the debugger I get this

<class 'dict'>: {'items': [{'id': '0e717975-4dce-b911-23276700d154', 'name': 'UK', 'dataGeography': 'IE', 'dataRegion': '01', 'billingType': 'trial', 'partner': {'id': '31e6dc97-4239-a6c5-2faae47b111a'}, 'organization': {'id': '045796c3-a448-b93c77d6b0d2'}, 'apiHost': 'https://api.com'}, {'id': '1e0f069e-458d-954b-353500717c20', 'name': 'US', 'dataGeography': 'IE', 'dataRegion': '02', 'billingType': 'trial', 'partner': {'id': '31e6dc97-3907-a6c5-2faae47b111a'}, 'organization': {'id': '045796c3-a448-b93c77d6b0d2'}, 'apiHost': 'https://api.com'},
This is repeated for each tenant.

Any help would be much appreciated.

Best wishes

Michael


RE: Retrieving items from JSON - buran - Oct-24-2019

for tenant in tenants["items"]:
    tenant_id = tenant["id"]
    tenant_name = tenant["name"]
    tenant_region = tenant["dataRegion"]
    print(', '.join([tenant_id, tenant_name, tenant_region]))
Output:
0e717975-4dce-b911-23276700d154, UK, 01 1e0f069e-458d-954b-353500717c20, US, 02



RE: Retrieving items from JSON - bazcurtis - Oct-24-2019

Thanks Buran. I will try that in the morning. I appreciate the quick reply.


RE: Retrieving items from JSON - bazcurtis - Oct-25-2019

Thank you. That worked a treat. I am now trying to get those results in to a Dictionary. Nothing gets added. What did I miss?

tenant_d = {'id': '', 'name': '', 'dataRegion': ''}
for tenant in tenants["items"]:
    tenant_id = tenant["id"]
    tenant_name = tenant["name"]
    tenant_region = tenant["dataRegion"]
    tenant_d['id']: tenant_id
    tenant_d['name']: tenant_name
    tenant_d['dataRegion']: tenant_region
    print(', '.join([tenant_id, tenant_name, tenant_region]))



RE: Retrieving items from JSON - buran - Oct-25-2019

starting from your code - you need to assign value to key, e.g.
tenant_d['id'] = tenant_id
or
directly
tenant_id = tenant["id"]
you can also construct dict like
tenant_d = {'id':tenant_id, 'name':tenant_name, 'dataRegion':tenant_region}
All that said - tenant is already a dict (just with more key:value pairs) why do you need to create a different dict? i.e. all these is not necessary


RE: Retrieving items from JSON - bazcurtis - Oct-25-2019

Thanks buran. I appreciate the quick response once again. I was using this to try and learn some more techniques. I only need those parts so I decided I would keep it cleaner. Later on in the process I will be returning a lot of other information, some of which I won't want, the rest I would want to output to a file.

The only way I learn is by doing. I was happy for my code to be bad, in the two many steps way, get the result I wanted, then go back and make it better. I hope that makes sense.


RE: Retrieving items from JSON - buran - Oct-25-2019

in this case here is one more technique
keys = ('id', 'name', 'dataRegion')
for tenant in tenants["items"]:
    tenant_d = {key:value for key, value in tenant.items() if key in keys}
    print(tenant_d)



RE: Retrieving items from JSON - bazcurtis - Oct-25-2019

That makes perfect sense. Thank you. I may have cracked this hours ago and not realised. Although your way is nicer. I was using PyCharm and checking the debugger. I expected the debugger to return the whole dictionary, but it just returns the last entry. I expected to see the other 9

tenant_d = {dict} <class 'dict'>: {'id': 'fbac1d47-d1d0-4180-a2de-8b3088c4fb35', 'name': 'UK', 'dataRegion': '01'}
'id' (4402128912) = {str} 'fbac1d47-d1d0-4180-a2de-8b3088c4fb35'
'name' (4407218048) = {str} 'UK'
'dataRegion' (4407271792) = {str} 'eu01'
__len__ = {int} 3


RE: Retrieving items from JSON - bazcurtis - Oct-25-2019

Sorry buran.

For my sanity I have written the below.

keys = ('id', 'name', 'dataRegion')
for tenant in tenants["items"]:
    tenant_d = {key:value for key, value in tenant.items() if key in keys}
    print(tenant_d)

for tenants in tenant_d.items():
    print(tenants)
That returns just one set of tenants item, the last one. It would seem it is not adding items to the dictionary


RE: Retrieving items from JSON - buran - Oct-25-2019

note that you can not have multiple identical keys in a dict. At each iteration of the first loop tenant_d is a dict with values for just one tenant. Then you print that dict and continue with next iteration if you look at the original json you will notice that tenants["items"] is actually a list of dicts. You need something like this to store the tenant_d if you want to keep all of them. Again that will replicate the original structure

after you finish the first loop tenant_d has the values for the last item in the list. that is what you iterate over and print in the second loop