Python:带有 ensure_ascii=False 和 encoding('utf-8') 的 json.dumps 似乎将字符串转换为字节 [duplicate]

Python: json.dumps with ensure_ascii=False and encoding('utf-8') seems to convert string to bytes [duplicate]

提问人:Robert Alexander 提问时间:2/8/2023 更新时间:2/8/2023 访问量:367

问:

我正在生成一个 Python 字典,如下所示:

placedict = {
   "id": geonames.geonames_id,
   "info": json.dumps(jsoninfo),
}

其中 id 是一个字符串,info 是一个有效且可读的 JSON 字符串:

'{"geonamesurl": "http://geonames.org/310859/kahramanmara\\u015f.html", "searchstring": "Kahramanmara\\u015f", "place": "Kahramanmara\\u015f", "confidence": 1, "typecode": "PPLA", "toponym": "Kahramanmara\\u015f", "geoid": 310859, "continent": "AS", "country": "Turkey", "state": "Kahramanmara\\u015f", "region": "Kahramanmara\\u015f", "lat": "37.5847", "long": "36.92641", "population": 376045, "bbox": {"northeast": [37.66426194452945, 37.02690583904019], "southwest": [37.50514805547055, 36.825904160959816]}, "timezone": "Europe/Istanbul", "wikipedia": "en.wikipedia.org/wiki/Kahramanmara%C5%9F", "hyerlist": ["part-of: Earth GeoID: 6295630 GeoCode: AREA", "part-of: Asia GeoID: 6255147 GeoCode: CONT", "part-of: Turkey GeoID: 298795 GeoCode: PCLI", "part-of: Kahramanmara\\u015f GeoID: 310858 GeoCode: ADM1", "part-of: Kahramanmara\\u015f GeoID: 310859 GeoCode: PPLA"], "childlist": ["Aksu", "Barbaros", "Egemenlik"]}'

但是正如你所看到的,虽然 jsoninfo 变量保存有效的 UTF-8 字符,但 placedict['info'] 字符不是 UTF-8 编码的,而是转义的。 因此,我尝试将 json.dumps 行更改为:

placedict = {
            "id": geonames.geonames_id,
            "info": json.dumps(jsoninfo).encode("utf-8"),
        }

甚至

placedict = {
            "id": geonames.geonames_id,
            "info": json.dumps(jsoninfo, ensure_ascii=False).encode("utf-8"),
        }

希望这将根据需要对 JSON 进行编码,但我看到在进行任何这些修改后,字典的“info”成员返回为 b'.........'因此在 MongoDB 中找到一个二进制字符串。

我想在 MongoDB 中使用 utf-8 编码的可读 JSON 字符串存储字典。

我在哪里犯了错误?

python json mongoDB UTF-8

评论

1赞 deceze 2/8/2023
它是将文本编码为字节的调用。只要摆脱它。你只想要这个选项。.encode(...)ensure_ascii=False
1赞 deceze 2/8/2023
如果您将其保存到 Mongo,我会质疑您为什么要手动转储到 JSON。您不想在 Mongo 的对象中保存对象吗?为什么要将字典存储为字符串?
0赞 Robert Alexander 2/8/2023
@deceze我一生中使用 MongoDB 和 noSQL 数据库的最初几分钟,很可能做错了:)将尝试研究和理解您的建议。有tps吗?

答:

2赞 Daweo 2/8/2023 #1

您可以只使用 json.dumps 和 ensure_ascii=False

import json
jsoninfo = {"El":"Niño"}
info = json.dumps(jsoninfo, ensure_ascii=False)
print(info)  # {"El": "Niño"}

评论

0赞 Robert Alexander 2/8/2023
非常感谢伙计们,我没有尝试过:) @deceze非常感谢你在上面的评论中说了同样的话!