【发布时间】:2019-06-20 22:31:19
【问题描述】:
我正在尝试通过 pyMongo 将 YAML(单独的 JSON 行)插入 mongoDB。我的一些键包含句点,这会产生错误bson.errors.InvalidDocument: key 'job.no' must not contain '.'。根据this SO answer,我需要遍历我的键来替换句点,这是有道理的。
我遇到的问题是我的数据很乱。我的 json 包含多层嵌套对象,我事先不知道包含句点的字符串是什么,或者它在哪里(哪个级别)。这是我的数据的一个小样本。
{"uuid":"94e31-02f59","project":{"name":"oasis","job.no":215493452,"subset":"beta"},"time":1412371841024}
我有一个递归迭代我的 JSON 的函数。我尝试了一些变体,但它要么使我的 JSON 变平(不再有嵌套对象),要么只返回第一个对象。我想保持我输入的结构。
def keyCleaner(line):
for k, v in line.iteritems():
if isinstance(v, dict):
keyCleaner(v)
else:
nK = k
if "." in k:
nK = k.replace(".", "_")
return nK, v
这是它当前返回的内容:
(u'uuid', u'94e31-02f59')
我希望它返回的是:
{"uuid":"94e31-02f59","project":{"name":"oasis","job_no":215493452,"subset":"beta"},"time":1412371841024}
但我不知道这是如何结合在一起的。有人可以帮忙吗?
【问题讨论】:
-
只是一个想法,为什么不将所有内容都转换为字符串,例如
json.dumps(),修复句点并将其更改回jsonjson.loads(),只是一个想法。 -
我也有这个想法。我正在处理数十万行,而且我事先不知道要查找什么字符串。现在它的“job.no”,10 行后它可能是“task.no”或“xx9.ze”。对我来说唯一有意义的是在键中查找句点。
标签: python json mongodb yaml pymongo