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

