将Python requests API调用转换为R httr请求时出现JSON类型转换报错
R httr调用API报JObject转JArray错误解决方案
问题根因
报错本质是R代码生成的请求体JSON结构不对,和接口要求、Python正常发起的请求结构不匹配:
- 接口要求请求体最外层是JSON数组,Python代码里用
[]包裹查询条件实现了这点,但原R代码直接把单个查询条件放在顶层list,序列化后是单个JSON对象而非数组,直接触发类型转换报错 - 接口要求
filters字段的值也必须是JSON数组,Python代码同样用[]包裹过滤条件,原R代码里该字段直接传了单个对象,就算修正顶层结构,这里也会触发同类错误
修复方法
调整R代码中query对象的嵌套结构,用无名list对应JSON里的数组结构,保证序列化后的结果和Python请求完全一致即可。
修正后完整代码
library(httr) library(jsonlite) username = "myemail@web.com" personal_access_token = "mytoken" url = "https://provider/api/query/dataset" # 构造嵌套结构:无名list对应JSON数组,命名list对应JSON对象 query <- list( list( eClass = "Fermentation", collection = "fermentations", filters = list( list(field = "attributes.experiment", value = "expnumber") ) ) ) # 可选校验步骤:打印序列化后的JSON,和Python请求结构做对比 # print(toJSON(query, pretty = TRUE, auto_unbox = TRUE)) response <- POST( url, add_headers("Content-Type" = "application/json"), authenticate(username, personal_access_token), body = query, encode = "json" ) content(response)
结构校验说明
运行校验步骤打印的JSON应该和以下结构完全一致,即可正常发起请求:
[ { "eClass": "Fermentation", "collection": "fermentations", "filters": [ { "field": "attributes.experiment", "value": "expnumber" } ] } ]
如果打印结果中长度为1的字符串被错误包裹成数组(比如"eClass": ["Fermentation"]),可以在序列化时加上auto_unbox = TRUE参数,或者对单值用jsonlite::unbox()包裹即可。
内容的提问来源于stack exchange,提问作者DavidLH
相关产品推荐
相关产品推荐

