Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delete an element in a JSON object

I am trying to loop through a list of objects deleting an element from each object. Each object is a new line. I am trying to then save the new file as is without the element contained within the objects.

{     "business_id": "fNGIbpazjTRdXgwRY_NIXA",     "full_address": "1201 Washington Ave\nCarnegie, PA 15106",     "hours": {         "Monday": {             "close": "23:00",             "open": "11:00"         },         "Tuesday": {             "close": "23:00",             "open": "11:00"         },         "Friday": {             "close": "23:00",             "open": "11:00"         },         "Wednesday": {             "close": "23:00",             "open": "11:00"         },         "Thursday": {             "close": "23:00",             "open": "11:00"         },         "Saturday": {             "close": "23:00",             "open": "11:00"         }     },     "open": true,     "categories": ["Bars", "American (Traditional)", "Nightlife", "Lounges", "Restaurants"],     "city": "Carnegie",     "review_count": 7,     "name": "Rocky's Lounge",     "neighborhoods": [],     "longitude": -80.0849416,     "state": "PA",     "stars": 4.0,     "latitude": 40.3964688,     "attributes": {         "Alcohol": "full_bar",         "Noise Level": "average",         "Music": {             "dj": false         },         "Attire": "casual",         "Ambience": {             "romantic": false,             "intimate": false,             "touristy": false,             "hipster": false,             "divey": false,             "classy": false,             "trendy": false,             "upscale": false,             "casual": false         },         "Good for Kids": true,         "Wheelchair Accessible": true,         "Good For Dancing": false,         "Delivery": false,         "Dogs Allowed": false,         "Coat Check": false,         "Smoking": "no",         "Accepts Credit Cards": true,         "Take-out": true,         "Price Range": 1,         "Outdoor Seating": false,         "Takes Reservations": false,         "Waiter Service": true,         "Wi-Fi": "free",         "Caters": false,         "Good For": {             "dessert": false,             "latenight": false,             "lunch": false,             "dinner": false,             "brunch": false,             "breakfast": false         },         "Parking": {             "garage": false,             "street": false,             "validated": false,             "lot": true,             "valet": false         },         "Has TV": true,         "Good For Groups": true     },     "type": "business" } 

I need to remove the information contained within the hours element, however the information is not always the same. Some contain all the days and some only contain one or two day information.

This is the code I've tried:

import json  with open('data.json') as data_file:     data = json.load(data_file)     for element in data:          del element['hours'] 

However, I am getting an error when running the code:

TypeError: 'unicode' object does not support item deletion

like image 463
Bradley Avatar asked Apr 13 '16 18:04

Bradley


People also ask

How do you remove an element from a JSON file in Java?

You can remove an element from the JSONArray object using the remove() method. This method accepts an integer and removes the element in that particular index.

How do I remove a field from a JSON object in Python?

Firstly just open the JSON file and load the data. Then to check if the key "data" and "UserName" are in it or not. If yes, delete these keys and their value.

How do I delete a JSON record?

rather than removing it from json, you can just access it with data["records"] that would solve the issue. However, if you still want to remove it then you can use data["records"] from json and store it in a variable. You will then have to write that into the file for persistence.


2 Answers

Let's assume you want to overwrite the same file:

import json  with open('data.json', 'r') as data_file:     data = json.load(data_file)  for element in data:     element.pop('hours', None)  with open('data.json', 'w') as data_file:     data = json.dump(data, data_file) 

dict.pop(<key>, not_found=None) is probably what you where looking for, if I understood your requirements. Because it will remove the hours key if present and will not fail if not present.

However I am not sure I understand why it makes a difference to you whether the hours key contains some days or not, because you just want to get rid of the whole key/value pair, right?

Now, if you really want to use del instead of pop, here is how you could make your code work:

import json  with open('data.json') as data_file:     data = json.load(data_file)  for element in data:     if 'hours' in element:         del element['hours']  with open('data.json', 'w') as data_file:     data = json.dump(data, data_file) 

If you want to write it to another file, just change the filename in the second open statement.

I had to change the indentation, as you might have noticed, so that the file has been closed during the data cleanup phase and can be overwritten at the end.

with is what is called a context manager, whatever it provides (here the data_file file descriptor) is available only within that context. It means that as soon as the indentation of the with block ends, the file gets closed and the context ends, along with the file descriptor which becomes invalid/obsolete.

Without doing this, you wouldn't be able to open the file in write mode and get a new file descriptor to write into.

like image 156
DevLounge Avatar answered Oct 08 '22 01:10

DevLounge


with open('writing_file.json', 'w') as w:     with open('reading_file.json', 'r') as r:         for line in r:             element = json.loads(line.strip())             if 'hours' in element:                 del element['hours']             w.write(json.dumps(element)) 

this is the method i use..

like image 45
Billy Avatar answered Oct 08 '22 01:10

Billy