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

如何用R解析特定JSON并生成指定结构的两列数据框?

解析JSON得到两列键值对结构

问题背景

给定如下JSON字符串:

tmp_extract <- "{\"encrypted_values\":[{\"name_a\":\"value_a\"}, {\"name_b\":\"value_b\"}, {\"name_c\":\"value_c\"}]}"

使用jsonlite::fromJSON解析后得到多列带NA的宽表:

tmp_extract |> jsonlite::fromJSON()

输出:

$encrypted_values
   name_a  name_b  name_c
1 value_a    <NA>    <NA>
2    <NA> value_b    <NA>
3    <NA>    <NA> value_c

期望转换为如下两列的长表结构:

# A tibble: 3 × 2
  name   value  
  <chr>  <chr>  
1 name_a value_a
2 name_b value_b
3 name_c value_c

解决方案

方法1:用tidyr转长表并清理NA

先解析得到宽表,再用pivot_longer转为长格式,过滤掉NA值即可:

library(jsonlite)
library(tidyr)

# 解析JSON
parsed_data <- fromJSON(tmp_extract)$encrypted_values

# 转换格式
result <- parsed_data |>
  pivot_longer(
    cols = everything(),  # 选中所有列
    names_to = "name",    # 列名转为name列
    values_to = "value"   # 列值转为value列
  ) |>
  drop_na(value)  # 去掉value为NA的行

print(result)

方法2:直接遍历解析后的列表提取键值

利用purrr遍历每个子对象,直接提取键和值并合并为数据框:

library(jsonlite)
library(purrr)
library(dplyr)

# 解析为列表
parsed_list <- fromJSON(tmp_extract)$encrypted_values

# 遍历每个子元素,提取键值对
result <- map_dfr(parsed_list, ~ tibble(
  name = names(.),
  value = .
))

print(result)

方法3:用tidyjson链式处理

如果想用tidyjson,需要用gather_object来提取每个子对象的键值,而非spread_all:

library(tidyjson)
library(dplyr)

result <- tmp_extract |>
  as.tbl_json() |>               # 转为tidyjson格式
  enter_object("encrypted_values") |>  # 进入目标数组
  gather_array() |>              # 展开数组元素
  gather_object() |>             # 提取每个对象的键
  spread_values(value = jstring(.)) |>  # 提取对应的值
  select(name, value)            # 保留需要的列

print(result)

内容的提问来源于stack exchange,提问作者tic-toc-choc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:04:50