flash
flash

Reputation: 1519

extract all the servers by parsing json response using python?

I have a service urlA that if I call gives me below json response which has list of servers in it keyed by datacenter. In future, I can have more keys and more servers for each keys.

{
    "abc": ["goldy11.abc.host.com", "goldy12.abc.host.com"],
    "pqr": ["goldy21.pqr.host.com", "goldy22.pqr.host.com"],
    "def": ["goldy31.def.host.com", "goldy32.def.host.com"],
    "jhk": ["goldy41.jhk.host.com", "goldy42.jhk.host.com"]
}

Similarly I have another service urlB which gives similar response but different set of servers:

{
    "abc": ["goldy81.abc.host.com", "goldy82.abc.host.com"],
    "pqr": ["goldy91.pqr.host.com", "goldy92.pqr.host.com"],
    "def": ["goldy71.def.host.com", "goldy72.def.host.com"],
    "jhk": ["goldy51.jhk.host.com", "goldy52.jhk.host.com"]
}

I want to extract all the server names from the above json response from both the url's which will be like this:

goldy11.abc.host.com
goldy12.abc.host.com
goldy21.pqr.host.com
goldy22.pqr.host.com
goldy31.def.host.com
goldy32.def.host.com
goldy41.jhk.host.com
goldy42.jhk.host.com
goldy81.abc.host.com
goldy82.abc.host.com
goldy91.pqr.host.com
goldy92.pqr.host.com
goldy71.def.host.com
goldy72.def.host.com
goldy51.jhk.host.com
goldy52.jhk.host.com

So I started off like this but I am kinda confuse on how to extract all the servers by parsing json response from both the service url without specifying any key in hardcoded way?

import json
import requests

responsea = requests.get("service-url-a")
responseb = requests.get("service-url-b")
json_data_a = json.loads(responsea.text)
json_data_b = json.loads(responseb.text)
# how can I combine both json_data_a and json_data_b response in the hosts list
hosts = [value for value_set in json_data_a.values() for value in value_set]
print hosts

Upvotes: 0

Views: 68

Answers (2)

Wyrmwood
Wyrmwood

Reputation: 3609

>>> import json
>>> a = """{
...     "abc": ["goldy11.abc.host.com", "goldy12.abc.host.com"],
...     "pqr": ["goldy21.pqr.host.com", "goldy22.pqr.host.com"],
...     "def": ["goldy31.def.host.com", "goldy32.def.host.com"],
...     "jhk": ["goldy41.jhk.host.com", "goldy42.jhk.host.com"]
... }"""

>>> b = """{
...     "abc": ["goldy81.abc.host.com", "goldy82.abc.host.com"],
...     "pqr": ["goldy91.pqr.host.com", "goldy92.pqr.host.com"],
...     "def": ["goldy71.def.host.com", "goldy72.def.host.com"],
...     "jhk": ["goldy51.jhk.host.com", "goldy52.jhk.host.com"]
... }"""
>>> data_a = json.loads(a)
>>> data_b = json.loads(b)
>>> print(json.dumps([value for values in list(data_a.values()) + list(data_b.values()) for value in values], indent=True))
[
 "goldy21.pqr.host.com",
 "goldy22.pqr.host.com",
 "goldy11.abc.host.com",
 "goldy12.abc.host.com",
 "goldy41.jhk.host.com",
 "goldy42.jhk.host.com",
 "goldy31.def.host.com",
 "goldy32.def.host.com",
 "goldy91.pqr.host.com",
 "goldy92.pqr.host.com",
 "goldy81.abc.host.com",
 "goldy82.abc.host.com",
 "goldy51.jhk.host.com",
 "goldy52.jhk.host.com",
 "goldy71.def.host.com",
 "goldy72.def.host.com"
]

Upvotes: 1

hwaring
hwaring

Reputation: 539

You want to flatten your array. With something like the following:

hosts = [value for value_set in json_data.values() for value in value_set]

This will give you a list of all the hosts. You can then proceed with the rest of your task from there.

Upvotes: 1

Related Questions