sách gpt4 ai đã đi

python - 将 JSON 之类的字符串转换为 python 字典

In lại 作者:行者123 更新时间:2023-11-28 22:23:02 28 4
mua khóa gpt4 Nike

现在我有一个来自 http 请求的类似 json 的字符串,但是键不是字符串格式。例如,

    >>> data_string = """
{
server_id: 1,
server_status: 200,
client: "client2",
content: [ {id: 0, info: "info0"}, {id: 2, info: "info2"} ]
}
"""

我想通过 JSON 格式化它,以便轻松提取数据字符串的字段。我有一个在 python 中使用 eval 的解决方案,

    eval(data_string, type('Dummy', (dict,), dict(__getitem__ = lambda s, n: n))())

它给了我正确的数据:

   {'server_id': 1, 'server_status': 200, 'client': 'client2', 'content': [{'id': 0, 'info': 'info0'}, {'id': 2, 'info': 'info2'}]}

请帮助我理解代码的技巧。谢谢。

PS:我试过json但是失败了。但是,yaml.load(data_string) 有效。

1 Câu trả lời

这一行

eval(data_string, type('Dummy', (dict,), dict(__getitem__ = lambda s, n: n))())

是一种非常丑陋的方式来做同样的事情

class Dummy(dict):
def __getitem__(self, key):
return key

globals_obj = Dummy()
eval(data_string, globals_obj)

然后这个globals_obj被传递给đánh giácủaglobals参数。 globals 必须是将名称映射到值的映射 对象。现在,当 đánh giá 遇到正在使用的变量时,它会引用 cái này 映射对象,就像通过 globals_obj['variable_name'] 一样。 __getitem__ 方法只是将给定的键作为值返回,因此 globals_obj[42] -> 42, globals_obj[None]-> Không có 等等。

这一切都非常不安全 - 如果服务器想要恶意,api 可能会返回类似 __import__('os').system('execute an evil command') 的代码。


如果这是 JavaScript 但不是 JSON, bạn có thể sử dụng demjson strict=False 模式下的模块。它肯定比使用 đánh giá 更好,并且可能比使用 YAML 作为 YAML parsers might be insecure 更好。 . And these bugs might be easily remotely exploitable .

>>> import demjson
>>> data_string = """
... {
... server_id: 1,
... server_status: 200,
... client: "client2",
... content: [ {id: 0, info: "info0"}, {id: 2, info: "info2"} ]
... }
... """
>>> demjson.decode(data_string, strict=False)
{'server_id': 1, 'server_status': 200, 'client': 'client2', 'content': [{'id': 0, 'info': 'info0'}, {'id': 2, 'info': 'info2'}]}

关于python - 将 JSON 之类的字符串转换为 python 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47306581/

28 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com