【问题标题】:JSONEncoder subclassing went wrongJSONEncoder 子类化出错
【发布时间】:2018-10-19 10:11:54
【问题描述】:

我需要一些关于在 Python 中扩展标准 json.JSONEncoder 的帮助。

我有这样的对象:

temp = {
    "a": "test/string",
    "b": {
        "b1": "one/more/string",
        "b2": 666
    },
    "c": 123
}

我需要覆盖(扩展)str 的编码以将/ 替换为\/

标准 json.dumps 将返回:

{"a":"test/string","b":{"b1":"one/more/string","b2":666},"c":123}

我需要得到:

{"a":"test\\/string","b":{"b1":"one\\/more\\/string","b2":666},"c":123}

甚至不要问我为什么需要这样做...我已经覆盖了 default() 方法,但是当我用我的子类调用 json.dumps 时它被忽略了

我的编码器类:

class RetardJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, str):
            return json.JSONEncoder.default(self, obj.replace("/", "\/"))

        return json.JSONEncoder.default(self, obj)

【问题讨论】:

  • 请分享您的代码,您现在拥有什么。发现错误会更容易。
  • 我用代码更新了我的问题。用json.dumps(obj, cls=RetardJSONEncoder)调用它
  • str 对象始终在内部进行编码,您无法覆盖它。
  • 我建议您在真正需要它的读者方面解决这个问题。否则,您最终会得到自己的 JSON 库。

标签: python json regex python-3.x


【解决方案1】:

使用json 包的当前实现,重新定义字符串的编码方式是不可能的。在将字符串放入要发送的对象之前,您更愿意为您的客户端应用修复程序或对字符串进行编码。否则,您最终会得到自己的 JSON 库。

【讨论】:

    猜你喜欢
    • 2017-10-10
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多