Home > Mobile >  How do I apply my function to all the values within a JSON file?
How do I apply my function to all the values within a JSON file?

Time:11-05

I have a JSON file with the following data:

[{
    "planet": "project pluto",
    "records": [
        {
            "project": "project pluto",
            "plan": "paper",
            "start": 1,
            "stop": 2
        }
    ]
},
{
    "planet": "project venus",
    "records": [
        {
            "project": "project venus",
            "plan": "rock",
            "start": 3,
            "stop": 4
        }
    ]
},    
{
    "planet": "project earth",
    "records": [
        {
            "project": "project earth",
            "plan": "scissors",
            "start": 5,
            "stop": 6
        }
    ]
} ]   

Whereby I want my output to be as follows:

[{'planet': 'project pluto', 'records': [['project pluto', 'paper', 1, 2]]}, {'planet': 'project venus', 'records': [{'project venus','rock', 3,4}]}, {'planet': 'project earth', 'records': [{'project earth', 'scissors',5, 6}]}]

This is the code that I currently have, however it only works for the first part of the JSON file and does not iterate over all the other values:

import json

with open('planets.json', 'r') as f:
    data = json.loads(f.read())
data[0]['records'][0] = list(data[0]['records'][0].values())
print(data)

When I do run the above code the output is as follows:

[{'planet': 'project pluto', 'records': [['project pluto', 'paper', 1, 2]]}, {'planet': 'project venus', 'records': [{'project': 'project venus', 'plan': 'rock', 'start': 3, 'stop': 4}]}, {'planet': 'project earth', 'records': [{'project': 'project earth', 'plan': 'scissors', 'start': 5, 'stop': 6}]}]

Question is: How can I iterate and apply to all the values in the JSON file?

CodePudding user response:

You can do it by iterating through the 'records' of each object in the data array.
Here's how to do it "in-place" (i.e. it modifies data itself):

import json
from pprint import pprint

with open('planets.json', 'r') as f:
    data = json.loads(f.read())

for obj in data:
    obj['records'] = list(obj['records'][0].values())

pprint(data, sort_dicts=False)

Output:

[{'planet': 'project pluto', 'records': ['project pluto', 'paper', 1, 2]},
 {'planet': 'project venus', 'records': ['project venus', 'rock', 3, 4]},
 {'planet': 'project earth', 'records': ['project earth', 'scissors', 5, 6]}]

If you don't want to modify the original data array, you would need to do something along these lines:

from copy import deepcopy
import json
from pprint import pprint

with open('planets.json', 'r') as f:
    data = json.loads(f.read())

modified_data = []
for obj in data:
    new_obj = {key: deepcopy(value) for key, value in obj.items() if key != 'records'}
    new_obj['records'] = [deepcopy(value) for value in obj['records'][0].values()]
    modified_data.append(new_obj)

pprint(modified_data, sort_dicts=False)
  • Related