Flask JSONEncoder将ensure_ascii设置为False

Law*_*son 5 python encoding json flask python-2.7

我正在研究一个小瓶子应用程序,我想在其中返回包含变音符号的字符串(通常是德语特殊字符,例如'ß').作为JSONEncoderflask中的默认值ensure_ascii=True,这将始终转换我的字符串

Hauptstraße 213
Run Code Online (Sandbox Code Playgroud)

对此:

Hauptstra\u00dfe 213
Run Code Online (Sandbox Code Playgroud)

我的第一个方法是创建一个非常基本的习惯 JSONEncoder

class NonAsciiJSONEncoder(json.JSONEncoder):
    def __init__(self, **kwargs):
        super(NonAsciiJSONEncoder, self).__init__(kwargs)
        self.ensure_ascii = False 
Run Code Online (Sandbox Code Playgroud)

如果我使用它,通过设置

app.json_encoder = NonAsciiJSONEncoder
Run Code Online (Sandbox Code Playgroud)

return jsonify(...)将实际返回包含'ß'的字符串.

但是,正如ensure_ascii默认编码器的属性一样,我认为通过将其设置为更改它可能会更好False

app.json_encoder.ensure_ascii = False
Run Code Online (Sandbox Code Playgroud)

这实际上将属性设置为False,我在返回之前检查了它.但不知何故,字符串仍然返回没有'ß'但是\u00df.

这怎么可能,正如我在自定义编码器中所做的那样,将此属性设置为False

Mar*_*ers 8

您在更改时设置属性app.json_encoder.ensure_ascii,这与实例属性不同.

JSONEncoder.__init__方法将实例属性设置为True,因为这是ensure_ascii参数的默认值.设置class属性不会阻止__init__方法设置实例属性,而是在此处获胜的实例属性.

你可以让你的子类将参数设置为False:

class NonASCIIJSONEncoder(json.JSONEncoder):
    def __init__(self, **kwargs):
        kwargs['ensure_ascii'] = False
        super(NonASCIIJSONEncoder, self).__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)

  • @LawrenceBenson:它是一个类,是的,不是实例,因为它传递给[`json.dumps()`函数](https://docs.python.org/2/library/json.html#json .dumps)作为`cls`参数. (2认同)