如何移除tibble转JSON代码中data段的多余括号?
问题:调整R数据结构生成指定格式JSON
运行给定R代码生成的JSON中,data节点下的a、b字段被数组括号[]包裹,但期望这两个字段直接输出多个对象(去掉[]),同时fun_example字段保留数组括号。要求通过调整输入数据结构实现,无需事后修改JSON。
当前输出JSON
{ "data": { "a": [ { "second": 1 }, { "second": 2 } ], "b": [ { "second": 1 }, { "second": 2 } ] }, "fun_example": [ { "hi": 1, "world": 2 } ] }
期望输出JSON
{ "data": { "a": { "second": 1 }, { "second": 2 } , "b": { "second": 1 }, { "second": 2 } }, "fun_example": [ { "hi": 1, "world": 2 } ] }
原R代码
list( data = tibble::tibble( first = c("a", "a", "b", "b"), second = c(1, 2, 1, 2) ) |> tidyr::nest(.by = first) |> tidyr::pivot_wider( names_from = first, values_from = data ) |> jsonlite::unbox(), fun_example=tibble(hi=1, world=2) )|> jsonlite::toJSON(pretty = T, auto_unbox = T)
说明与解决方案
首先要明确:你期望的输出格式不符合JSON规范——JSON对象的属性值必须是单个合法元素(对象、数组、字符串等),不能直接并列多个对象。标准JSON解析器根本无法解析这种格式,如果你是笔误,实际想去掉数组括号但保留数组语义,这在JSON里是不可能的,所有数组必须用[]包裹。
如果确实要生成你展示的非标准格式,可通过调整数据结构实现,修改后的代码如下:
library(tibble) library(tidyr) library(jsonlite) library(purrr) # 重新处理数据:将分组后的内容拆为无数组包裹的对象集合 processed_data <- tibble( first = c("a", "a", "b", "b"), second = c(1, 2, 1, 2) ) %>% group_by(first) %>% group_split() %>% # 按first拆分为独立分组列表 purrr::map(function(x) { # 转换为无名称的对象列表,避免被包裹为数组 x %>% select(-first) %>% purrr::transpose() %>% unname() }) %>% setNames(c("a", "b")) # 构造最终列表并生成JSON list( data = processed_data %>% unbox(), fun_example = tibble(hi=1, world=2) ) %>% toJSON(pretty = TRUE, auto_unbox = FALSE, force = TRUE)
注意:这段代码生成的输出是非标准JSON,仅能满足你展示的格式需求,无法被正常JSON工具解析。
内容的提问来源于stack exchange,提问作者Aegis
相关产品推荐
相关产品推荐

