【问题标题】:Using UTF-8 encoded JSON fixture file in Django在 Django 中使用 UTF-8 编码的 JSON 夹具文件
【发布时间】:2012-09-19 22:00:04
【问题描述】:

我正在尝试编写一个 JSON 初始数据夹具,它将在每次调用 syncdb 后加载。

我在我的mysite/myapp/fixtures 目录中放置了一个initial_data.json 文件:

[
  {
    "model": "myapp.Person",
    "pk": 1,
    "fields": {
      "first_name": "Tom",
      "last_name": "Yam"
    }
  }
]

当文件以 ASCII 编码时一切正常,但是当我将其保存为 UTF-8 编码时(我需要使用非 ASCII 字符)我得到以下错误:

Problem installing fixture 'initial_data.json': Traceback (most recent call last):
File "D:\Tom\DjangoEnv\Lib\site-packages\django\core\management\commands\loaddata.py", line 190, in handle
for obj in objects:
File "D:\Tom\DjangoEnv\Lib\site-packages\django\core\serializers\json.py", line 47, in Deserializer
raise DeserializationError(e)
DeserializationError: No JSON object could be decoded

根据 Django documentation,我需要在使用非 ASCII 数据和 JSON 序列化程序时设置 ensure_ascii=False,但我不知道该怎么做(因为它是从 syncdb 函数调用的.

任何想法如何使用 UTF-8 编码的 JASON 文件作为夹具?

【问题讨论】:

  • 你对 Unicode 转义有什么看法?

标签: django json unicode utf-8 fixtures


【解决方案1】:

load_data 不会将ensure_ascii 选项传递给序列化程序,因此您有两个选择:

  1. 在加载之前将数据转换为转义的ascii unicode,即:

    import codecs
    encoded = codecs.open('/tmp/tst.txt', 'r', 'utf-8').read().encode(
                'ascii', 'backslashreplace')
    open('/tmp/tst-encoded.txt', 'w').write(encoded)
    
  2. 编写自己的管理命令,通过ensure_ascii

希望这会有所帮助。

【讨论】:

  • 谢谢!!!转换成功了。我做了一个小改动:open('/tmp/tst-encoded.txt', 'w').write(encoded[6:])。切片需要删除\ufeff
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多