我有一个像这样的JSON字符串:
u'{"repeat_password":"password","password":"password","username":"üääöp","email":"püäöö@email.com"}'
并通过以下方式运行它:
def deserialization_helper(json):
stream = StringIO(unicode(json))
return JSONParser().parse(stream)
#stuff...
serializer = ValidationSerializer(data=deserialization_helper(request.DATA['data']))
但是我似乎得到了以下异常,但仅限于德语字符,如果我使用普通的英文字符,它似乎工作正常。
u'JSON parse error - \\'ascii\\' codec can\\'t encode characters in position 64-67: ordinal not in range(128)'
我已将其缩小到以下一行
JSONParser().parse(stream)
但似乎无法找到一种方法让它乐意接受英语和德语。
非常感谢任何帮助。
答案 0 :(得分:4)
我遇到了同样的问题。尝试将此代码放入settings.py
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
答案 1 :(得分:2)
如果我们查看JSONParser
(parsers.py
)的来源:
def parse(self, stream, media_type=None, parser_context=None):
"""
Parses the incoming bytestream as JSON and returns the resulting data.
"""
parser_context = parser_context or {}
encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)
try:
data = stream.read().decode(encoding)
return json.loads(data)
except ValueError as exc:
raise ParseError('JSON parse error - %s' % six.text_type(exc))
我们看到Django-Rest-Framework需要一个 byte 流,它使用Django DEFAULT_CHARSET
(大多数时候是UTF-8)进行解码。
如果不了解更多,很难提出解决方案:
request.DATA
已由DRF解析器解析,因此当所有都是纯JSON时,没有理由重新解析。 data
是带有JSON内容的字符串,您可以使用force_bytes
来创建字节,或直接使用json.loads
(其中接受unicode
)。