为什么bson.dumps转义了我的字典(jsons)列表

时间:2019-04-03 03:49:11

标签: javascript python-3.x mongodb flask bson

我正在使用mongo.db来托管json的集合,我使用json列表将其转化为

    cursor = finder.find_pokemans(db) #this just searches the db for query and works fine
    all_pokemon = [k for k in cursor]

但是当我将列表传递给jinja2时,我可以使用以下行作为json列表使用它:

return render_template('index.html', list_all_pokemon = bson.json_util.dumps(all_pokemon))

我的html模板中的这一行(我正在使用内联js)

var all_pokemon = {{ list_all_pokemon }};

变成

var all_pokemon = [{"_id": {"$oid": "5ca40f82f2463129878bdd93"}, "id": 1, "name": "Bulb

换句话说,它转义了我所有的引号,因此它不能用作json。 我尝试在列表理解行中进行jsonifying,并在传递的变量中尝试了json.dumps,但出现此错误:

TypeError: Object of type ObjectId is not JSON serializable

有关如何解决此问题的任何线索?

编辑:我可以使用

class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        return json.JSONEncoder.default(self, o)
return render_template('index.html', list_all_pokemon = JSONEncoder().encode(all_pokemon))

它将正常工作,但是我想知道为什么我不能像其他场景一样进行json.dumps或jsonify以及我是否可以在这里使用这些格式。

1 个答案:

答案 0 :(得分:1)

{{ list_all_pokemon }}是一个字符串-Jinja2将对所有未标记为HTML安全的字符串进行HTML转义。

您可以通过以下方法避免这种转义:{{ list_all_pokemon | safe }} ...但是,发生这种情况时,Jinja2知道如何单独执行此操作。这是做您想要的事情的正确方法:

var all_pokemon = {{ all_pokemon | tojson }};

在旧的Flask中,还需要将其标记为安全,因为它并不能为您做到这一点({{ all_pokemon | tojson | safe }}),但我相信当前的Flask并不需要您这样做。