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

如何将嵌套JSON解析为符合指定结构的R列表/数据框?

解决嵌套JSON解析为指定R结构的问题

针对你的需求,以下是两种实现预期解析结构的方案:

方案一:将实例转换为列表结构(推荐)

直接把每个实例处理为独立列表,避免数据框单行提取时的嵌套问题,同时确保各feature符合要求:

library(jsonlite)
library(data.table)

json_string <- '{
  "instances": [
    {
      "feature_1": [
        { "col1":  "value1", "col2": "value2" },
        { "col1":  "value2", "col2":  "value3" },
        { "col1":  "value4", "col2":  "value5" }
      ],
      "feature_2": "raw_value",
      "feature_3": [ "list_value_1", "list_value_2"],
      "feature_4": {
        "feature_4_prop1": "prop_value_1",
        "feature_4_prop2": "prop_value_2"
      }
    },
    {
      "feature_1": [
        { "col1":  "value1", "col2": "value2" },
        { "col1":  "value2", "col2":  "value3" },
        { "col1":  "value4", "col2":  "value5" }
      ],
      "feature_2": "raw_value",
      "feature_3": [ "only_1_value"],
      "feature_4": {
        "feature_4_prop1": "prop_value_1",
        "feature_4_prop2": "prop_value_2"
      }
    }
  ]
}'

# 解析JSON,获取实例列表
parsed_instances <- fromJSON(json_string, simplifyDataFrame = TRUE, flatten = FALSE)$instances

# 处理每个实例,转换为目标结构
processed_instances <- lapply(parsed_instances, function(inst) {
  list(
    feature_1 = as.data.table(inst$feature_1),  # 转成data.table
    feature_2 = inst$feature_2,                 # 保留原始值
    feature_3 = inst$feature_3,                 # 始终为列表(jsonlite默认保留数组为列表)
    feature_4 = inst$feature_4                  # 保留嵌套对象,可直接用$访问属性
  )
})

# 获取第一个实例
row <- processed_instances[[1]]

# 验证结构
print(row$feature_1)               # 直接操作data.table的列:row$feature_1$col1
print(row$feature_2)               # 输出原始值
print(row$feature_3)               # 输出列表(即使单个元素)
print(row$feature_4$feature_4_prop1) # 直接访问嵌套属性

方案二:保留数据框结构,自定义单行提取函数

如果需要保留instances的data.frame结构,可以写一个函数来提取并整理单行数据:

library(jsonlite)
library(data.table)

# 定义单行提取函数
get_processed_row <- function(instance_df, row_idx) {
  raw_row <- instance_df[row_idx, ]
  list(
    feature_1 = as.data.table(raw_row$feature_1[[1]]),  # 提取嵌套列表中的data.frame转成data.table
    feature_2 = raw_row$feature_2,
    feature_3 = raw_row$feature_3,
    feature_4 = raw_row$feature_4[[1]]                  # 提取嵌套的对象列表
  )
}

# 解析JSON
parsed_data <- fromJSON(json_string, simplifyDataFrame = TRUE, flatten = FALSE)

# 获取处理后的单行
row <- get_processed_row(parsed_data$instances, 1)

# 查看结构
str(row)

关键说明

  • 当fromJSON用simplifyDataFrame=TRUE解析时,instances会被转为data.frame,其中feature_1和feature_4列的每个元素都是嵌套结构,取单行时会被包裹在列表中,因此需要用[[1]]提取内部的实际数据。
  • feature_3在解析时,jsonlite会自动将JSON数组保留为R列表(即使只有单个元素),无需额外转换。
  • 转换feature_1为data.table后,可直接使用data.table的所有语法操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:01:12