Python:JSON来对象Unicode问题

时间:2017-09-07 23:42:16

标签: python unicode

我使用以下命令将响应结果转换为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

似乎可以做到这一点,但我想检查一下我是否正确有效地做到了?

1 个答案:

答案 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')]