如何在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
相关产品推荐
相关产品推荐

