python创建json与plone对象

时间:2016-06-07 08:19:09

标签: plone

我有一个带有plone对象的json文件,并且有一个对象字段给我一个错误:

UnicodeDecodeError('ascii', '{"id":"aluminio-prata", "nome":"ALUM\xc3\x8dNIO PRATA", "num_demaos":0, "rendimento": 0.0, "unidade":"litros", "url":"", "particular":[], "profissional":[], "unidades":[]},', 36, 37, 'ordinal not in range(128)') (Also, the following error occurred while attempting to render the standard error message, please see the event log for full details: 'NoneType' object has no attribute 'getMethodAliases')

我已经知道女巫领域是,"title" from title = obj.pretty_title_or_id(),当我从这里删除它时,确定:

json += '{"id":"' + str(id) + '", "nome":"' + title + '", "num_demaos":' + str(num_demaos) + ', "rendimento": ' + str(rendimento) + ', "unidade":"' + str(unidade) + '", "url":"' + link_produto + '", "particular":' + arr_area_particular + ', "profissional":' + arr_area_profissional + ', "unidades":' + json_qtd + '},

但是当我离开它时,我遇到了这个错误。

UnicodeDecodeError('ascii', '{"id":"aluminio-prata", "nome":"ALUM\xc3\x8dNIO PRATA", "num_demaos":0, "rendimento": 0.0, "unidade":"litros", "url":"", "particular":[], "profissional":[], "unidades":[]},', 36, 37, 'ordinal not in range(128)') (Also, the following error occurred while attempting to render the standard error message, please see the event log for full details: 'NoneType' object has no attribute 'getMethodAliases')

2 个答案:

答案 0 :(得分:2)

我将假设当你读取 JSON文件时会发生错误。

在内部,Plone几乎可以使用Python Unicode字符串。如果从文件中读取字符串,则需要在Plone可以使用之前将其解码为Unicode。如果您没有给出任何指示,Python将假定该字符串被编码为ASCII,并将在此基础上尝试其Unicode转换。它与写作类似:

unicode("ALUM\xc3\x8dNIO PRATA")

会产生同样的错误。

实际上,您使用的字符串显然是使用UTF-8字符集编码的。从“\ xc3”中可以看出这一点,这也是有道理的,因为这是Plone在向外界发送数据时使用的字符集。

那么,你如何解决这个问题呢?您必须指定转换为Unicode时要使用的字符集:

"ALUM\xc3\x8dNIO PRATA".decode('UTF8')

这为您提供了一个没有错误的Python Unicode字符串。

因此,在您将JSON文件读入字符串(让我们称之为mystring)之后,您需要使用mystring.decode('UTF8')对其进行显式解码。 unicode(mystring, 'UTF8')是同一操作的另一种形式。

答案 1 :(得分:0)

史蒂夫已经写过了title.decode('utf8') 一个例子说明了事实:

>>> u"Ä" == u"\xc4"
True              # the native unicode char and escaped versions are the same

>>> "Ä" == u"\xc4"  
False             # the native unicode char is '\xc3\x84' in latin1

>>> "Ä".decode('utf8') == u"\xc4"
True              # one can decode the string to get unicode

>>> "Ä" == "\xc4"
False             # the native character and the escaped string are
                  # of course not equal ('\xc3\x84' != '\xc4').

我发现这个Thread对UTF-8的编码/解码问题和理解非常有帮助。