noob_coder
noob_coder

Reputation: 829

Create a list of dictionaries from JSON data in python

I want to create a list of dictionaries from a json value in python. The json data is

{
  "data": [
    {
      "date": "2017-07-28_15-54-10",
      "name": "name1",
      "state": "true"
    },
    {
      "date": "2017-07-29_15-54-10",
      "name": "name2",
      "state": "true"
    }
  ]
}

I want to put this data in a Array of dicts(name1,name2,name3) containing array of dicts(the "data" part of json), something like

[
  {
    "name1": [
      {
        "date": "2017-07-28_15-54-10"
      },
      {
        "state": "true"
      }
    ]
  },
  {
    "name2": [
      {
        "date": "2017-07-28_15-54-10"
      },
      {
        "state": "true"
      }
    ]
  }
]

I got all the data and my code is

for jn in data:
    name = jn.get("name")
    my_dict = {}
    my_dict1 = {}
    my_list = []
    my_dict["date"] = jn.get("date")
    my_dict1["state"] = jn.get("state")
    my_list.append(my_dict)   # dict for date
    my_list.append(my_dict1)   # dict for state
    my_name_dict = {}
    my_name_dict[name] = my_list   # add the small dicts to  the "name" dict
    my_final_array.append(my_name_dict)
    print(my_final_array)

I am able to get this output

  {
    "name1": [
      {
        "date": "2017-07-28_15-54-10"
      },
      {
        "state": "true"
      }
    ]
  },
  {
    "name2": [
      {
        "date": "2017-07-28_15-54-10"
      },
      {
        "state": "true"
      }
    ]
  }

I am struggling with adding these dicts to a list/array. When i print the value of my_final_array i just get the last line of the dict and not all the lines in the list. My code is also a little bit messy, is there any other way to do this?

Upvotes: 3

Views: 10381

Answers (5)

Josef Korbel
Josef Korbel

Reputation: 1208

Pythonic way to do this seems to be dictionary comprehension

a = {
  "data": [
    {
      "date": "2017-07-28_15-54-10",
      "name": "name1",
      "state": "true"
    },
    {
      "date": "2017-07-29_15-54-10",
      "name": "name2",
      "state": "true"
    }
  ]
}

output = [{item['name']: {k: v for (k, v) in item.items() if k is not 'name'} for item in a['data']}]

output
> [{'name1': {'date': '2017-07-28_15-54-10', 'state': 'true'}, 'name2': {'date': '2017-07-29_15-54-10', 'state': 'true'}}]

Upvotes: 1

Lante Dellarovere
Lante Dellarovere

Reputation: 1858

Use a simple list comprehension:

# if you are reading data from a file...
import json

path = "/path/to/json"
d = json.load(open(path, "r"))

# ...else
d = {
    "data": [
        {
            "date": "2017-07-28_15-54-10", 
            "name": "name1", 
            "state": "true",
        }, 
        {
            "date": "2017-07-29_15-54-10", 
            "name": "name2", 
            "state": "true",
        }
        ]
    }

records = [{x["name"]: [{"date": x["date"]}, {"state": x["state"]}]} for x in d["data"]]
records

>>> [{'name1': [{'date': '2017-07-28_15-54-10'}, {'state': 'true'}]},
 {'name2': [{'date': '2017-07-29_15-54-10'}, {'state': 'true'}]}]

If you plan to add more keys to your records, can make this list comprehension more general by getting all keys but name, like:

records = [
    {x["name"]: [{k: v} for k, v in x.items() if k != "name"]} 
    for x in d["data"]
]

Upvotes: 6

Some
Some

Reputation: 514

r = {
  "data": [
    {
      "date": "2017-07-28_15-54-10",
      "name": "name1",
      "state": "true",
    },
     {
      "date": "2017-07-29_15-54-10",
      "name": "name2",
      "state": "true",
    }
   ]
  }

data = r['data']
result = []
mkdic = lambda x: [{k: v} for k, v in x.items() if k != "name"]
for i in data:
    result.append( {i.get("name"): mkdic(i) })
import pprint
pprint.pprint(result, indent = 2)

Upvotes: 1

Anna
Anna

Reputation: 567

You need to create your final list under the for-statement, like this:

my_final_array = []
for jn in data:
    name = jn.get("name")
    my_dict = {}
    my_dict1 = {}
    my_list = []
    my_dict["date"] = jn.get("date")
    my_dict1["state"] = jn.get("state")
    my_list.append(my_dict)   # dict for date
    my_list.append(my_dict1)   # dict for state
    my_name_dict = {}
    my_name_dict[name] = my_list   # add the small dicts to  the "name" dict
    my_final_array.append(my_name_dict)
    print(my_final_array)

Upvotes: 0

Jeril
Jeril

Reputation: 8521

Can you try the following:

json_data = {
    "data": [
        {
            "date": "2017-07-28_15-54-10",
            "name": "name1",
            "state": "true",
        },
        {
            "date": "2017-07-29_15-54-10",
            "name": "name2",
            "state": "true",
        }
    ]
}
main_list = []
for val in json_data['data']:
    temp_dict = {}
    temp_key = val.pop('name')
    temp_dict[temp_key] = [val]
    main_list.append(temp_dict)
print(main_list)

Output:

[  
    {  
        'name1':[  
            {  
                'date':'2017-07-28_15-54-10',
                'state':'true'
            }
        ]
    },
    {  
        'name2':[  
            {  
                'date':'2017-07-29_15-54-10',
                'state':'true'
            }
        ]
    }
]

Upvotes: 4

Related Questions