UnicodeDecodeError在完整对象上使用json.dumps时,仅在打印特定属性时工作正常

2024-06-18 11:16:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在尝试对以下对象使用json.dumps时,出现UnicodeDecodeError:

testObject = {'crs': {'wkid': 4326, 'wkt': 'WGS84'}, 'candidates': [{'score': 200, 'type': 'ADR', 'location': {'y': 50.2485465358886, 'x': 4.38243469412172, 'crs': {'wkid': 4326, 'wkt': 'WGS84'}}, 'address': {'city': 'Fontenelle', 'munkey': '0585'}}, {'score': 200, 'type': 'ADR', 'location': {'y': 50.4123146893214, 'x': 4.32436581556278, 'crs': {'wkid': 4326, 'wkt': 'WGS84'}}, 'address': {'city': "Fontaine-l'\\xe3\\x89v\\xe3\\xaaque", 'munkey': '0324'}}, {'score': 200, 'type': 'ADR', 'location': {'y': 50.3217667573625, 'x': 4.21386030471998, 'crs': {'wkid': 4326, 'wkt': 'WGS84'}}, 'address': {'city': 'Fontaine-valmont', 'munkey': '0362'}}, {'score': 200, 'type': 'ADR', 'location': {'y': 49.7151404477129, 'x': 5.23438436377951, 'crs': {'wkid': 4326, 'wkt': 'WGS84'}}, 'address': {'city': 'Fontenoille', 'munkey': '0541'}}], 'id': u'1', 'address': {'city': u'Fontaine-lev', 'street': u'Avenue des Chones', 'zone': u'1301', 'house': u'19'}}
print json.dumps(testObject, False, False)

错误消息如下:

UnicodeDecodeError('ascii', '"Fontaine-l\\'\\xe3\\x89v\\xe3\\xaaque"', 12, 13, 'ordinal not in range(128)')
'ascii' codec can't decode byte 0xe3 in position 12: ordinal not in range(128)

似乎这个字符串中的字符编码有问题。此字符串通过编码为“utf8”的psycopg2连接器获取,并发出postgresql DB请求。实际值应为“Fontaine l'Ev”ê“奎”

但真正奇怪的是,当我循环这个对象的'candidates'属性,并对每个候选对象执行json.dumps时,它不会崩溃:

for c in testObject.candidates:
  print json.dumps(c, False, False)

结果:

{'score': 200, 'type': 'ADR', 'location': {'y': 50.4123146893214, 'x': 4.32436581556278, 'crs': {'wkid': 4326, 'wkt': 'WGS84'}}, 'address': {'city': "Fontaine-l'\\xe3\\x89v\\xe3\\xaaque", 'munkey': '0324'}}

如您所见,所讨论的字符串是完全相同的。为什么json.dumps在仅转储单个候选对象时工作正常,但在尝试转储整个对象时却突然无法解码相同的字符串

编辑:我简化了代码以提供上面的示例,但显然这很好。这是我的实际代码:

for search in searches:
  print "search: ", search
  searchCrash = {'score': 200, 'type': 'ADR', 'location': {'y': 50.4123146893214, 'x': 4.32436581556278, 'crs': {'wkid': 4326, 'wkt': 'WGS84'}}, 'address': {'city': "Fontaine-l'\\xe3\\x89v\\xe3\\xaaque", 'munkey': '0324'}}
  print "searchCrash: ", json.dumps(searchCrash, False, False)
  print "dump search: ", json.dumps(search, False, False)

我得到以下信息:

search: {'score': 200, 'type': 'ADR', 'location': {'y': 50.4123146893214, 'x': 4.32436581556278, 'crs': {'wkid': 4326, 'wkt': 'WGS84'}}, 'address': {'city': "Fontaine-l'\\xe3\\x89v\\xe3\\xaaque", 'munkey': '0324'}}
searchCrash: {'score': 200, 'type': 'ADR', 'location': {'y': 50.4123146893214, 'x': 4.32436581556278, 'crs': {'wkid': 4326, 'wkt': 'WGS84'}}, 'address': {'city': "Fontaine-l'\\xe3\\x89v\\xe3\\xaaque", 'munkey': '0324'}}
dump search: UnicodeDecodeError('ascii', '"Fontaine-l\\'\\xe3\\x89v\\xe3\\xaaque"', 12, 13, 'ordinal not in range(128)')
    'ascii' codec can't decode byte 0xe3 in position 12: ordinal not in range(128)

所以我几乎只是打印搜索,看看里面是什么。我将这个打印结果复制粘贴到一个变量中,然后json.dumps将其转储,这很好,但是当我在实际搜索中使用json.dumps时,它会失败,并出现unicode错误


Tags: jsoncityaddresstypelocationwktscoreadr