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

R jsonlite包data.frame转JSON时字段名in被自动加句点问题

问题根因

字段名被修改和jsonlite包没有关系,是R创建data.frame的默认机制导致的:

  • in是R的内置保留关键字,属于语法层面被占用的名称
  • data.frame()默认开启check.names = TRUE校验,会自动将不符合R变量命名规则、与保留字重名的列名做合规化修正,你定义的"in"列在data.frame创建阶段就已经被自动重命名为"in.",toJSON()只是如实输出已经存在的列名而已。
修复方案

创建data.frame时传入check.names = FALSE参数,关闭自动列名校验修正即可。

修正后的完整代码:

library(jsonlite)

query_json3 <- data.frame(
  "eClass" = c("Fermentation","Sample", "ResultValue","Experiment"), 
  "collection" = c("fermentations","samples", "resultValues", "experiments"),
  check.names = FALSE
)
filters1 <- data.frame(
  "field" = "attributes.experiment", 
  "value" = "EXP-EB-22-019",
  check.names = FALSE
)
filters2 <- data.frame(
  "field" = "originID", 
  "in" = "fermentations.originID",
  check.names = FALSE
)
filters3 <- data.frame(
  "field" = "SubjectID", 
  "in" = "samples.id",
  check.names = FALSE
)
filters4 <- data.frame(
  "field" = "type", 
  "value" = "Small-Scale Screening",
  check.names = FALSE
)

query_json3[1, "filters"][[1]] <- list(filters1)
query_json3[2, "filters"][[1]] <- list(filters2)
query_json3[3, "filters"][[1]] <- list(filters3)
query_json3[4, "filters"][[1]] <- list(filters4)

toJSON(query_json3)

运行上述代码输出的JSON会保留"in"字段名,和预期输出完全一致。

如果是已经生成好的data.frame,也可以在转JSON前手动修正列名:

# 把所有被改成in.的列名改回in
colnames(filters2)[colnames(filters2) == "in."] <- "in"
colnames(filters3)[colnames(filters3) == "in."] <- "in"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:03:25