API返回JSON解析失败:提前EOF及编码异常问题求助
解决API返回UTF-16编码JSON导致的解析失败问题
看起来你遇到的核心问题是API返回的JSON编码格式变了——从之前的UTF-8改成了UTF-16BE(大端序),这才导致你用content(req, "text")得到空字符串,手动处理raw时又因为错误过滤字节出现解析错误。
问题分析
从你给出的req$content片段能看到,每个有效字符(比如{、"、字母)都跟着一个00字节,开头的fe ff是UTF-16BE的字节序标记(BOM)。这种编码下,直接用默认的UTF-8解析自然会失败,甚至返回空内容。你之前尝试去掉所有00字节的操作是错误的,因为这些00是UTF-16编码中不可缺少的高字节部分。
解决方案
方法1:直接指定编码解析
用httr::content函数时,明确指定编码为"UTF-16BE",就能正确提取文本内容:
content_text <- content(req, "text", encoding = "UTF-16BE") content <- jsonlite::fromJSON(content_text, simplifyVector = FALSE)
方法2:手动转换raw内容
如果你想自己处理raw字节,可以用rawToChar配合正确的编码参数:
# 开头的BOM(fe ff)会被rawToChar自动识别,无需手动移除 content_text <- rawToChar(req$content, encoding = "UTF-16BE") content <- jsonlite::fromJSON(content_text, simplifyVector = FALSE)
验证编码的小技巧
如果不确定编码类型,可以用stringi包的工具检测:
library(stringi) stri_enc_detect(req$content)
这个工具会返回最可能的编码类型,帮你确认是不是UTF-16BE。
为什么之前的代码失效?
之前API返回的是UTF-8编码的JSON,content(req, "text")默认用UTF-8解析没问题,但现在API变更了输出编码,导致原有代码无法正确识别内容。
内容的提问来源于stack exchange,提问作者RNO
相关产品推荐
相关产品推荐

