【问题标题】:What's the best way to deal with differences between JSON and Python when deserializing?反序列化时处理 JSON 和 Python 之间差异的最佳方法是什么?
【发布时间】:2020-12-31 03:24:37
【问题描述】:

我正在使用基于 python 的 API 处理消息传递服务。 API 完成了大部分反序列化工作,将消息呈现到 python 字典中。但是,在某些情况下,呈现的字典包括元数据键/值对,其中值是尚未反序列化的字典的字符串呈现。我创建了一个简单的反序列化方法,但我不得不反复修改它以涵盖 python 和 JSON 之间的三个区别,即单引号与双引号、布尔值的大小写差异以及 None 与 null:

def deserializeMetaData(metaDataStr):
    metaDataStr = metaDataStr.replace("'",'"').replace('True', 'true').replace('False', 'false').replace('None', 'null')
    metaDataDict = json.loads(metaDataStr)
    return metaDataDict

metaDataStr = "{'SomeCount': 1, 'SomeOtherCount': 2, 'SomeBool': True, 'SomethingElse': None}" 
deserializeMetaData(metaDataStr)
{'SomeCount': 1, 'SomeOtherCount': 2, 'SomeBool': True, 'SomethingElse': None}

像我反复调用replace 一样,针对特定的极端情况似乎是一种非常糟糕的做法。是否有另一种方法可以更好地涵盖这些和所有极端情况?

【问题讨论】:

  • 为什么不使用有效的序列化程序?
  • @ScottHunter 你能详细说明一下吗?不确定什么是有效的反序列化器。
  • 产生有效 JSON 的;喜欢json.dumps

标签: python json deserialization


【解决方案1】:

可能已将 metaDataStr 错误地解释为需要反序列化的 JSON。相反,将其视为字典的字符串文字会导致 Abstract Syntax Tree (ast) module

安全地计算表达式节点或包含 Python 的字符串 文字或容器显示。提供的字符串或节点只能 由以下 Python 文字结构组成:字符串、字节、 数字、元组、列表、字典、集合、布尔值和无。

这可用于安全地评估包含 Python 的字符串 来自不受信任来源的值,无需解析这些值 自己。它无法评估任意复杂的 表达式,例如涉及运算符或索引。

因此以下内容足以将字符串转换为字典而不会出现问题:

import ast
    
metaDataStr = "{'SomeCount': 1, 'SomeOtherCount': 2, 'SomeBool': True, 'SomethingElse': None}"
d = ast.literal_eval(metaDataStr)
type(d)
Out[18]: dict

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2021-10-24
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2010-09-16
    相关资源
    最近更新 更多