【问题标题】:json.loads() gives UnicodeEncodeError when parsing JSON object recived from node.jsjson.loads() 在解析从 node.js 接收的 JSON 对象时给出 UnicodeEncodeError
【发布时间】:2018-05-30 09:56:39
【问题描述】:

我正在尝试将一些 json 对象从我的 node.js 服务器发送到 python 脚本。但是,当尝试使用 json.loads 将 json 对象转换为字典时,对于许多输入,都会出现 UnicodeEncodeErrors。我需要做什么才能正确解码 js 对象。

Error: UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 2062: character maps to <undefined>
    at PythonShell.parseError (D:\Users\Temp\Desktop\empman\node_modules\python-shell\index.js:183:17)
    at terminateIfNeeded (D:\Users\Temp\Desktop\empman\node_modules\python-shell\index.js:98:28)
    at ChildProcess.<anonymous> (D:\Users\Temp\Desktop\empman\node_modules\python-shell\index.js:88:9)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:219:12)
    at Process.onexit (D:\Users\Temp\Desktop\empman\node_modules\async-listener\glue.js:188:31)
    ----- Python Traceback -----
    File "word.py", line 38, in <module>
      json_data=open('data.txt').read()
    File "D:\Users\Temp\AppData\Local\Programs\Python\Python36-32\lib\encodings\cp1252.py", line 23, in decode
      return codecs.charmap_decode(input,self.errors,decoding_table)[0]

对应的python代码

from docx import Document
from docx.shared import Inches
import sys
import io
import json
document = Document('template.docx')
# newdocument = Document('resume.docx')
# print(sys.argv)  # Note the first argument is always the script filename.
resumearray = [];
for x in range(0, 21):
    resumearray.append(input())
#json_data=open('data.txt').read()
f = io.open('data','r', encoding='utf-16-le')
# #datastore = json.loads(f.read)
print(f.read())
# text = f.read()
# json_data = text

# document.add_paragraph('_______________________________________________________________________')
#document.add_paragraph(resumearray[1])
k=resumearray[1]
#document.add_paragraph(k)
jsobject = json.loads(k)
document.add_paragraph('_______________________________________________')
#document.add_paragraph(jsobject.values())
for x in range(0, 9):
    if resumearray[x]=='[]':
        document.add_paragraph('nothing was found')
    else:
        document.add_paragraph(resumearray[x])

【问题讨论】:

标签: python node.js


【解决方案1】:

您在 Windows 上运行 python,默认编码为 cp1252。 json 编码为 utf-8,因此出现错误。

>>> with open('blob.json', encoding='cp1252') as f:
...     j = json.load(f)
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/local/lib/python3.6/json/__init__.py", line 296, in load
    return loads(fp.read(),
  File "/usr/local/lib/python3.6/encodings/cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 2795: character maps to <undefined>

改用 utf-8:

>>> with open('blob.json', encoding='utf-8') as f:
...     j = json.load(f)
... 
>>> print(len(j))
29

【讨论】:

  • 这行得通。谢谢你。虽然我希望不必写入文件并直接将输入传递给 python
  • @AbhishekAnand 也许看看这个问题的答案stackoverflow.com/q/23450534/5320906
  • 我看过了。在我的原始代码中,我正在这样做。然而,解码错误来了。我猜python只能在参数中接受原始输入。我已经切换到你建议的方法,所以一切都很好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 2015-05-16
  • 2017-12-15
  • 1970-01-01
相关资源
最近更新 更多