Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python是否提供了一个钩子来根据键名定制json字符串化?_Python_Json_Python 3.x - Fatal编程技术网

python是否提供了一个钩子来根据键名定制json字符串化?

python是否提供了一个钩子来根据键名定制json字符串化?,python,json,python-3.x,Python,Json,Python 3.x,我正在尝试编写一个用于记录dict的高效字符串化例程,但希望根据键名编辑某些值。我看到jsondeconder提供了object\u pairs\u hook,它提供了键和值,但我没有看到jsondeconder的对应钩子——只是“default”,它只提供值。在我的例子中,这些值只是其他字符串,因此不能单独基于这些字符串进行处理。我错过了什么吗 例如,如果我有一个带有以下内容的dict: { "username": "Todd", "

我正在尝试编写一个用于记录dict的高效字符串化例程,但希望根据键名编辑某些值。我看到
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***"}]}'