json - 如何使用 jq 对对象进行展平的逆运算?
问题描述
通过另一个 SO 线程,我发现了如何使用 jq “扁平化” JSON。我正在寻找如何做相反的事情,即“展开”它。
原始 JSON 在层次结构中具有混合级别,例如:
{
"X1": {
"X1o1": {
"X1o1o1": "abc",
"X1o1o2": "def"
},
"X1o2" : {
"X1o2o1" : "ghi",
"X1o2o2": "jkl"
},
"X1o3": "mno"
},
"X2": "pqr"
}
正如https://jqplay.org/s/Eo6h_3V8PO所示,为了与其他同事一起工作,我需要使用“扁平化”该结构 ()
reduce (tostream|select(length==2)) as $i ({}; .[[$i[0][]|tostring]|join("_")] = $i[1] )
生产:
{
"X1_X1o1_X1o1o1": "abc",
"X1_X1o1_X1o1o2": "def",
"X1_X1o2_X1o2o1": "ghi",
"X1_X1o2_X1o2o2": "jkl",
"X1_X1o3": "mno",
"X2": "pqr"
}
我需要帮助的是如何使用 jq 将这样的输出 JSON 转换回原始形式?
我看到split
唯一适用于字符串的tostring | split("_")
.
任何指导我正确方向的指针和/或示例将不胜感激。
解决方案
使用您的样本输入,过滤器:
reduce to_entries[] as $kv ({}; setpath($kv.key|split("_"); $kv.value))
产生:
{
"X1": {
"X1o1": {
"X1o1o1": "abc",
"X1o1o2": "def"
},
"X1o2": {
"X1o2o1": "ghi",
"X1o2o2": "jkl"
},
"X1o3": "mno"
},
"X2": "pqr"
}
推荐阅读
- javascript - Can I use javascript with in an Android App
- r - 提高此脚本的性能
- laravel - 嵌套关系中的 Laravel 搜索
- python - 为什么我的线性判别分析系数矩阵是 2x1 而不是 2x2?
- javascript - 通过在组件内部执行函数来响应 redux 状态变化
- python - lua:http post动态
- reactjs - 使用 React 在另一个组件中获取下拉菜单的值
- python - 从包含文本格式数据的其他列创建熊猫数据框的列
- javascript - Firebase 云函数:保存 TypeScript Map() - 如何?
- javascript - dygraphs 无法按预期工作,1.1.0 版确实可以使用 Waterfox 和 Safari,但不能使用 2.1.0 版