python是否提供了一个钩子来根据键名定制json字符串化?
我正在尝试编写一个用于记录dict的高效字符串化例程,但希望根据键名编辑某些值。我看到python是否提供了一个钩子来根据键名定制json字符串化?,python,json,python-3.x,Python,Json,Python 3.x,我正在尝试编写一个用于记录dict的高效字符串化例程,但希望根据键名编辑某些值。我看到jsondeconder提供了object\u pairs\u hook,它提供了键和值,但我没有看到jsondeconder的对应钩子——只是“default”,它只提供值。在我的例子中,这些值只是其他字符串,因此不能单独基于这些字符串进行处理。我错过了什么吗 例如,如果我有一个带有以下内容的dict: { "username": "Todd", "
jsondeconder
提供了object\u pairs\u hook
,它提供了键和值,但我没有看到jsondeconder
的对应钩子——只是“default”,它只提供值。在我的例子中,这些值只是其他字符串,因此不能单独基于这些字符串进行处理。我错过了什么吗
例如,如果我有一个带有以下内容的dict:
{
"username": "Todd",
"role": "Editor",
"privateKey": "1234ad1234e434134"
}
我想记录:
'{"username":"Todd","role":"Editor","privateKey":"**redacted**"}'
python中有什么好的工具可以做到这一点吗?或者我应该直接递归地迭代(可能是嵌套的)dict吗?JSON库有两个函数,即<代码>转储()和
加载()
。要将json转换为字符串,请使用dumps()
,反之亦然,请使用loads()
您可以使用对象挂钩“重新加载”它,然后再次转储它
def redact(o):
if 'privateKey' in o:
o['privateKey'] = '***redacted***'
return o
>>> d
{'username': 'Todd', 'role': 'Editor', 'privateKey': '1234ad1234e434134', 'foo': ['bar', {'privateKey': 'baz'}]}
>>> json.dumps(json.loads(json.dumps(d), object_hook=redact))
'{"username": "Todd", "role": "Editor", "privateKey": "***redacted***", "foo": ["bar", {"privateKey": "***redacted***"}]}'
(感谢编辑波形发生器)使用
json.dumps()
@Rabindra:你似乎没有抓住问题的关键。哦,我现在注意到了。对不起,那么我的回答/评论不对。请忽略。谢谢,但我不想只转储我的dict-我想转储除某个特定键的值以外的所有dict,因此我需要某种钩子来告诉我何时处理该键抱歉,我现在意识到了这一点。那么,我的回答/评论不正确。请忽略。不过,我有一个问题。你只是想在编校密钥和密码的同时对其进行字符串化,还是想在需要时在检索编校密钥/密码的同时对其进行解字符串化?这是一个日志文件,所以我只想对其进行字符串化,而不是解字符串化。有趣的是,这似乎是最简单的解决方案。它比我目前使用的hack慢4倍左右(完成任务,但只有在输入结构不变的情况下),但它是一个更好的通用解决方案,性能与我编写的用于迭代对象和字符串化的丑陋函数相当。可能会被标记为解决方案,但会给它一天时间。谢谢我将采用这个解决方案=它涉及最少的重新实现。而且,由于我只是清理日志文件中的字符串,所以使用'str'而不是最终的(按操作顺序)json.dumps会稍微快一点
def redact(o):
if 'privateKey' in o:
o['privateKey'] = '***redacted***'
return o
>>> d
{'username': 'Todd', 'role': 'Editor', 'privateKey': '1234ad1234e434134', 'foo': ['bar', {'privateKey': 'baz'}]}
>>> json.dumps(json.loads(json.dumps(d), object_hook=redact))
'{"username": "Todd", "role": "Editor", "privateKey": "***redacted***", "foo": ["bar", {"privateKey": "***redacted***"}]}'