为何R生成的JSON对象中每个子列表外多一层方括号?如何修正?
解决httr2 POST请求中JSON字段多余方括号的问题
问题根源
- 错误核心是重复序列化JSON:先调用
jsonlite::toJSON()把R对象转成JSON字符串,再传给httr2::req_body_json(),而req_body_json()本身会自动将R对象序列化为JSON,两次处理导致每个字符串被多套了一层方括号。 - 另外
jsonlite::toJSON()默认会把单个字符串(R中长度1的字符向量)转为数组,这也是多余方括号的来源之一。
修正后的代码
library(httr2) library(jsonlite) # 构造目标数据结构:三级列表,最外层是命名字段 Data <- list( list('alfa', 'bravo', 'charlie'), list('charlie', 'delta', 'echo'), list('echo', 'golf', 'foxtrot') ) named_list <- list(Entities = Data) # 直接用req_body_json处理R对象,无需手动转JSON req <- request("##URL goes here###") %>% req_headers("Accept" = "application/json") %>% # 关键:传入R对象,添加auto_unbox=TRUE参数避免单个字符串被包裹为数组 req_body_json(named_list, auto_unbox = TRUE) # 验证序列化后的JSON结构(可选) cat(jsonlite::toJSON(named_list, pretty = TRUE, auto_unbox = TRUE)) # 预请求检查格式 req %>% req_dry_run() # 发送请求 resp <- req_perform(req) print(resp_raw(resp))
关键修改说明
- 移除手动序列化步骤:不再调用
toJSON()生成JSON字符串,直接把R列表对象传给req_body_json(),让它内部完成正确的序列化。 - 添加
auto_unbox = TRUE:这个参数会让jsonlite将长度为1的向量(比如单个字符串)直接转为JSON的字符串值,而不是包裹成数组,完美匹配你需要的JSON结构。
修正后的JSON结构
{ "Entities": [ [ "alfa", "bravo", "charlie" ], [ "charlie", "delta", "echo" ], [ "echo", "golf", "foxtrot" ] ] }
内容的提问来源于stack exchange,提问作者fpt
相关产品推荐
相关产品推荐

