我使用以下命令将响应结果转换为object:
response = requests.get(url=request_url)
myobjs = json.loads(response.text, object_hook=lambda d: Myobj(**d))
return myobjs
和
class Myobj(object):
def __init__(self, id, display):
self.id = str(id)
self.name = str(display)
示例JSON:
[
{
"id": "92cbb711-7e4d-417a-9530-f1850d9bc687",
"display": "010lf.com",
},
{
"id": "1060864a-a3a5-40c2-aa94-651fe2d10ae9",
"display": "010lm.com",
}
]
它运行良好,直到有一天,返回的JSON中的一个字段显示包含unicode值,例如:
"display": "관악저널.kr"
它会给出以下错误:
File "mycode.py", line 5, in __init__
self.name = str(display)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
我原以为str()函数会正确处理unicode代码字符串。
我错过了什么?
我尝试从
更改行self.name = str(display)
到
self.name = display
似乎可以做到这一点,但我想检查一下我是否正确有效地做到了?
答案 0 :(得分:1)
json
将字符串作为Unicode返回。因此要么将它们存储为Unicode(正确的解决方案),要么将它们编码为UTF-8。请注意,str()
使用ascii
编解码器将Unicode字符串转换为字节字符串,因此不适用于非ASCII的Unicode字符串。
#!python2
#coding:utf8
import json
text = '''\
[
{
"id": "92cbb711-7e4d-417a-9530-f1850d9bc687",
"display": "관악저널.kr"
},
{
"id": "1060864a-a3a5-40c2-aa94-651fe2d10ae9",
"display": "010lm.com"
}
]'''
class Myobj(object):
def __init__(self, id, display):
self.id = id # or id.encode('utf8')
self.name = display # or display.encode('utf8')
def __repr__(self):
return 'MyObj({self.id!r},{self.name!r})'.format(self=self)
myobjs = json.loads(text, object_hook=lambda d: Myobj(**d))
print(myobjs)
输出:
[MyObj(u'92cbb711-7e4d-417a-9530-f1850d9bc687',u'\uad00\uc545\uc800\ub110.kr'),
MyObj(u'1060864a-a3a5-40c2-aa94-651fe2d10ae9',u'010lm.com')]