当前位置: 首页 > 面试题库 >

删除JSON对象中的元素

宓英哲
2023-03-14
问题内容

我试图遍历对象列表,从每个对象中删除一个元素。每个对象都是换行符。我试图然后按原样保存新文件,而对象中不包含任何元素。我知道这可能是一个简单的任务,但似乎无法完成这项工作。如果有人可以伸出援手,将不胜感激。谢谢。

{
"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"

}

我需要删除小时元素中包含的信息,但是信息并不总是相同的。有些包含全天,有些仅包含一两天的信息。我尝试使用的代码是Pyton,我整天都在搜索该代码以解决问题。我对Python不太熟练。任何帮助,将不胜感激。

import json

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

对不起,只是添加我在运行代码时遇到的错误是TypeError:“ unicode”对象不支持项目删除


问题答案:

假设您要覆盖相同的文件:

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)如果我了解您的要求,那么您可能正在寻找。因为hours如果存在,它将删除密钥,如果不存在,它将不会失败。

但是我不确定我是否理解小时键是否包含几天对您有什么影响,因为您只想摆脱整个键/值对,对吗?

现在,如果您确实要使用del而不是pop,请按以下步骤使代码正常工作:

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)

编辑 因此,如您所见,我添加了代码以将数据写回到文件中。如果要将其写入另一个文件,只需在第二个open语句中更改文件名。

您可能已经注意到,我不得不更改了缩进,以便在数据清理阶段关闭文件,并在最后将其覆盖。

with是所谓的上下文管理器,它提供的任何内容(此处为data_file文件描述符)
在该上下文中可用。这意味着,一旦with块的缩进结束,文件就会关闭并且上下文也将结束,文件描述符也变得无效/过时。

如果不这样做,您将无法以写入模式打开文件并获得要写入的新文件描述符。

我希望已经足够清楚了…

第二编辑

这次,您似乎显然需要执行以下操作:

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


 类似资料:
  • 问题内容: 我有一个看起来像这样的json数组: 我想有一个函数来删除“孩子”为空的元素。我该怎么做?我不是要答案,只是建议 问题答案: 要遍历对象的键,请使用循环: 要测试空元素的所有元素,可以使用递归方法:遍历所有元素,然后也递归地测试它们的孩子。 可以使用关键字删除对象的属性: 说明文件: https://developer.mozilla.org/zh-CN/docs/JavaScript

  • 问题内容: 我想从JSON中删除JSON元素或整行。 我有以下JSON字符串: 问题答案: 您可以使用splice从数组中删除元素。

  • 问题内容: 我有一个要在Python中清理的JSON数组。我要删除该属性: data.json 我正在设置列表理解以删除该属性,但是我不确定如何创建关注以下内容的变量: 当我理解列表时,它返回一个空数组。我必须纠正什么才能使其正常工作? 问题答案: 解决您的问题的一种简单方法是使用以下方法删除不需要的密钥: 您应该添加一些安全检查,但是您知道了。

  • 问题内容: 我正在通过jQuery ajax将JSON发送到Node服务器。我的jQuery ajax正在运行。见下文。 我的问题是,当我控制台日志用户(一个已字符串化的json对象)时,我在丢失的数组中有信息。我丢失的对象部分看起来像这样。 它在控制台中显示为字符串形式,如下所示: 不会存储在父用户对象内部的那些数组中存储的信息。关于为什么会这样的任何建议都会有所帮助。如果您有其他方法可用于通过

  • 使用JavaVersion9,我有一些测试代码可以从通过向DefaultListModel传递一个refrence创建的列表中删除一个项目。这就是我所做的。 > 创建DefaultListModel对象 通过调用addelement将8个元素添加到它(A..H)中 通过调用RemoveElement删除项 创建一个Jlist,将我的DefaultListModel的引用传递给它 列表框显示所有8个

  • 问题内容: 我有一个看起来像这样的数组: 而且我需要删除重复项,以便保留类似以下内容: 我尝试安装underscore.js并使用._uniq,但这似乎仅在对象中出现一对时才起作用。我似乎无法使它跨多个键工作。 当我尝试类似的东西: 我只得到前三个唯一值(每个年级一个)。但是我需要所有年级和领域的唯一值。是否有一种简单的方法将两个键都馈给_.uniq函数? 最终,我需要一个列表,其中每个唯一的等级