You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中解析同来源的两个JSON文件(其一解析失败)

解析PubChem JSON文件的问题与解决方法

一、JSON文件的核心差异

  • 编码不兼容:无法解析的JSON(file1)包含无效UTF-8字节,错误提示中可见乱码12�??14;可正常解析的JSON(file2)采用标准UTF-8编码,无此类问题。
  • 读取完整性问题:readLines报错premature EOF,说明file1在读取时被截断,根源是服务器响应的编码不兼容导致读取中断,而非文件本身结构不完整。

二、通用解决方法

方法1:用httr获取内容并处理编码(推荐)

直接用jsonlite或rjson读取URL时,无法正确处理非UTF-8编码的响应,建议先用httr获取原始内容,再转换为标准UTF-8:

library(httr)
library(jsonlite)

# 封装解析函数,适合批量遍历场景
parse_pubchem_json <- function(pubchem_url) {
  # 获取服务器原始响应
  resp <- GET(pubchem_url)
  # 将二进制内容转为字符,指定原编码为ISO-8859-1并转为UTF-8,自动替换无效字节
  clean_content <- iconv(rawToChar(content(resp, "raw")), 
                         from = "ISO-8859-1", 
                         to = "UTF-8", 
                         sub = "")
  # 解析处理后的JSON内容
  jsonlite::fromJSON(clean_content)
}

# 测试示例链接
file1 <- "https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/24750/JSON/?response_type=display.json"
file2 <- "https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/177/JSON/?response_type=display.json"

parsed1 <- parse_pubchem_json(file1)
parsed2 <- parse_pubchem_json(file2)

方法2:适配rjson包的处理方式

如果需要使用rjson,同样先处理编码再解析:

library(rjson)
library(httr)

parse_with_rjson <- function(pubchem_url) {
  resp <- GET(pubchem_url)
  clean_content <- iconv(rawToChar(content(resp, "raw")), 
                         from = "ISO-8859-1", 
                         to = "UTF-8", 
                         sub = "")
  rjson::fromJSON(clean_content)
}

parsed1 <- parse_with_rjson(file1)

关键注意点

  • PubChem部分化合物的JSON数据采用ISO-8859-1编码存储特殊字符,直接按UTF-8读取会触发编码错误,iconv的sub参数可自动替换无效字节,避免解析中断。
  • 使用httr::GET能确保完整获取服务器响应,解决readLines出现的内容截断问题。

内容的提问来源于stack exchange,提问作者lawsq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:53:12