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

