R调用Ensembl比对API时toJSON无法转换R类型22错误如何解决
错误原因
这个报错不属于jsonlite本身的缺陷,是调用逻辑存在冗余步骤导致的:
- 报错里提到的
R type 22是R语言的外部指针类型,jsonlite本身不支持将这类特殊对象序列化为JSON - 调用
content(r)时,httr会默认将JSON响应自动解析为R列表对象,部分特殊场景下解析后的对象内部可能残留未公开的外部指针属性,后续传入toJSON时就会触发转换失败 - 原代码里的
fromJSON(toJSON(content(r)))本身是完全冗余的操作,相当于把已经解析好的R对象又转回JSON再重新解析,既浪费性能也引入了不必要的报错风险
解决方案
直接删除冗余的序列化反序列化步骤,两种可选写法都可以规避该问题:
写法1:直接使用httr自动解析的结果
library(httr) library(jsonlite) tmp_chr = "16" tmp_seq_str = "87187517" tmp_seq_end = "87187717" server = "http://rest.ensembl.org" ext = paste0("/alignment/region/homo_sapiens/", tmp_chr, ":", tmp_seq_str, "-", tmp_seq_end, "?species_set_group=primates") r = GET(paste(server, ext, sep = ""), content_type("application/json")) # 先校验请求状态,避免解析错误的响应内容 stop_for_status(r) json_object = content(r)[[1]]
写法2:直接解析响应原始文本(兼容性更好)
如果担心httr自动解析引入异常,可以手动读取响应文本再用jsonlite解析:
r = GET(paste(server, ext, sep = ""), content_type("application/json")) stop_for_status(r) resp_text = content(r, as = "text") json_object = fromJSON(resp_text)[[1]]
内容的提问来源于stack exchange,提问作者gokberk
相关产品推荐
相关产品推荐

