簡體   English   中英

如何刪除 a.json 文件中的所有“$oid”和“$date”?

[英]How to remove all the “$oid” and "$date" in a .json file?

我有一個 .json 文件保存在我的計算機中,其中包含$oid$date類的內容,稍后會在 BigQuery 中給我帶來麻煩。 例如:

{
  "_id": {
  "$oid": "5e7511c45cb29ef48b8cfcff"
  },
  "about": "some text",
  "creationDate": {
  "$date": "2021-01-05T14:59:58.046Z"
  }
}

我希望它看起來像(所以它不僅僅是從字符串中刪除一些字母):

{
  "_id": "5e7511c45cb29ef48b8cfcff",
  "about": "some text",
  "creationDate": "2021-01-05T14:59:58.046Z"
}

使用 Pymongo,可以執行以下操作:

my_file['id']=my_file['id']['$oid']
my_file['creationDate']=my_file['creationDate']['$date']

如果不使用 Pymongo,這會怎樣,因為我想首先找到這樣的鍵並刪除所有有問題的$oid$date

編輯:抱歉措辭不好,我的意思是是否有可能找到包含這些有問題的鍵 $ 而無需寫下字典中的每個鍵。 實際上,有更多帶有大表的文件,其中許多可以包含這個。

我會嘗試如下所示的方法。

import json
file = open('data.json','r')
data = json.load(file)
for k,v in data.items():
    #check if key has dict value
    if type(v) == dict:
        #find id with $
        r = list(data[k].keys())[0]
        #change value if $ occurs
        if r[0] == '$':
            data[k] = data[k][r]
print(data)

好像我們得到了這個 output。

{'_id': '5e7511c45cb29ef48b8cfcff', 'about': 'some text', 'creationDate': '2021-01-05T14:59:58.046Z'}

當您使用bson.json_util.dumps()使用默認編碼器時,會出現$oid$date字段。

如果您可以控制這些文件的來源,您可能希望從源頭解決“問題”,而不必圍繞它編寫代碼。 下面的代碼片段顯示了如何實現自定義編碼器來格式化 output 的格式:

import json
import datetime
from pymongo import MongoClient


class MyJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.isoformat()
        if hasattr(obj, '__str__'):  # This will handle ObjectIds
            return str(obj)

        return super(MyJsonEncoder, self).default(obj)


db = MongoClient()['mydatabase']
db.mycollection.insert_one({'Date': datetime.datetime.now()})
record = db.mycollection.find_one()
print(json.dumps(record, indent=4, cls=MyJsonEncoder))

印刷:

{
    "_id": "60a55e3cea5bf57c79177871",
    "Date": "2021-05-19T19:51:40.808000"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM