当前位置: 首页 > 面试题库 >

解析JSON时出现解码问题[python]

云默
2023-03-14
问题内容

我正在用Python阅读JSON文件,其中包含许多字段和值(约8000条记录)。Env:Windows 10,Python 3.6.4;码:

import json
json_data = json.load(open('json_list.json'))
print (json_data)

这样我得到一个错误。下面是堆栈跟踪:

  json_data = json.load(open('json_list.json'))
  File "C:\Program Files (x86)\Python36-32\lib\json\__init__.py", line 296, in load
    return loads(fp.read(),
  File "C:\Program Files (x86)\Python36-32\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 7977319: character maps to <undefined>

伴随着我,我尝试了

import json
with open('json_list.json', encoding='utf-8') as fd:
     json_data = json.load(fd)
     print (json_data)

与此相关,我的程序运行了很长时间,然后挂起,没有任何输出。

我搜索了几乎与此相关的所有主题,但找不到解决方案。

注意:JSON数据是有效的,因为当我在Postman /任何REST客户端上看到它时,它都不会报告任何异常。

关于此方法或替代解决方案的任何帮助(如何将我的JSON数据加载(通过将其转换为字符串然后返回到JSON等)的任何方式)都将有很大的帮助。

这是报告的错误周围的文件外观:

>>> from pprint import pprint
>>> f = open('C:/Users/c5242046/Desktop/test2/dblist_rest.json', 'rb')
>>> f.seek(7977319)
7977319
>>> pprint(f.read(100))
(b'\x81TICA EL ABGEN INGL\xc3\x83\xc2\x89S, S.A.","memory_size_gb":"64","since'
 b'":"2017-04-10","storage_size_gb":"84.747')

问题答案:

您要查询的代码段似乎已被双重编码。基本上,无论最初生成此数据的是什么,都会以Latin-1或其他相关编码生成文本(Windows代码页1252?)。然后将其送入将Latin-1转换为UTF-8
两次的过程。

当然,“转换”数据已经是UTF-8了,但告诉计算机它是Latin-1只是产生了mojibake。

该字符串INGL\xc3\x83\xc2\x89S 表明,这种分析,如果你可以猜测,它应该说 Inglés
在上的情况下,实现了UTF-8编码É是\
XC3
\
X89,然后检查哪些字符这两个字节编码中的Latin-1(或者,碰巧是Unicode,它是Latin-1的超集,尽管它们在编码级别上不兼容)。

注意,这里至关重要的步骤是能够猜测问题序列 应该
代表哪个字符串。它还说明了为什么要在有足够上下文的情况下包含有问题的数据的代表性片段!-对于调试至关重要。

无论如何,如果整个文件具有相同的症状,则您应该能够撤消第二次,多余且不正确的重新编码。尽管文件中有这么多错误,但让我想像这可能是一个只有几个记录的本地问题。也许它们是从多个输入文件合并而成的,只有其中一个出现此错误。然后,要修复它,需要进行大量的侦探工作,手动编辑或识别并修复错误源。快速而肮脏的解决方法是简单地手动删除任何错误的记录。



 类似资料:
  • 问题内容: 我是使用AngularJS的新手,但在解析json响应时遇到问题。这是我正在使用的HTML代码: 这是使用AngularJS的Javascript代码: HTML使用服务器返回的JSON显示变量$ scope.response,但顶部列表中未显示任何内容。JSON的格式完美,但是$ scope.cars变量似乎始终为空。 我究竟做错了什么? 非常感谢, GA 问题答案: $ http.

  • 问题内容: 我正在尝试在我的android应用程序中解析Json的链接是https://www.buzzador.com/apps/present_software/webservice/index.php?op=ProductQ&campaign_id=607&userid=10776 当我将其放入Json对象时,它给我带来错误错误是:08-31 14:40:52.281:WARN / Syst

  • 本文向大家介绍解决golang json解析出现值为空的问题,包括了解决golang json解析出现值为空的问题的使用技巧和注意事项,需要的朋友参考一下 我是通过beego框架,将请求过来的json进行解析,并将值保存在结构体中 其中 UpdateCommentRequestData的结构是这样的 common.request的结构是这样的 我使用1中的代码进行解析,发现request.Id的值

  • 我已经下载了json和我的对话档案。我坚持使用奇怪的编码。 json的例子: 应该是这样的: 我正试图这样反序列化它: 不幸的是,输出如下: 有人知道Facebook如何编码json吗?我尝试了几种方法,但没有结果。 谢谢你的帮助。

  • 问题内容: 我一直在尝试使用json.net(https://dl.dropboxusercontent.com/u/2976553/json)解析json块,但是它未能说明json对象后面有文本。但是,如果您查看它在哪里引发异常 我检查了TokenType,它似乎不应该生成异常。我也修改了代码以使其忽略,但是它似乎没有解析任何内容。 我正在用这个.. 我已经将json粘贴到许多在线检查器中,他们

  • 我试图使用restTemplate.exchange()方法解析来自服务的JSON响应。但由于解析错误而失败。 Java代码 JSON对象Java类 错误: 2018-07-12 15:40:00.876错误6044--[nio-8080-exec-1]O.A.C.C.C.[.[/].[dispatcherServlet]:路径为[]的上下文中servlet[dispatcherServlet]的