如何将 JSON 对象的嵌套部分转换为点链式平面 JSON?
Posted
技术标签:
【中文标题】如何将 JSON 对象的嵌套部分转换为点链式平面 JSON?【英文标题】:How can I convert a nested part of a JSON object to dot-chained flat JSON? 【发布时间】:2019-07-03 15:09:30 【问题描述】:我想要这个:
"level1a": "value",
"level1b":
"level2a":
"level3a": "nestedvalue"
,
"level2b": "value"
最终看起来像这样:
"level1a": "value",
"level1b":
"level2a.level3a": "nestedvalue",
"level2b": "value"
然后到这个:
"level1a": "value",
"level1b": [
"key": "level2a.level3a",
"val": "nestedvalue"
,
"key": "level2b",
"val": "value"
]
我只希望一些嵌套字段被点缀,并且我希望能够选择哪些字段。我有一组 JSON 文档,其中包含数千个字段,其中大多数嵌套在一个或两个一级或二级字段下。
最后我想在点链字段上使用 jq 的 to_entries 之类的东西,以便准备好作为嵌套字段摄取到 Elasticsearch 中,以便在保持所有信息的同时保持较低的字段总数。
有什么想法吗?
【问题讨论】:
这不是模棱两可吗?链式键“k.1.k.2”最初是 1、2、3 还是 4 级? 我希望能够选择一个键并将其下方的所有内容链接起来,尽可能多的级别。原始键中没有一个点,所以它会保持清楚数据过去的样子。 【参考方案1】:您显然已经知道问题第二部分的解决方案,所以这里是第一部分的解决方案:
# linearize all paths of the input object or array
def dotkeys:
def stringify: map(tostring) | join(".");
. as $in
| reduce paths(scalars) as $p (null;
($in|getpath($p)) as $v
| setpath([$p|stringify]; $v));
def chain(key):
.[key] |= dotkeys ;
chain("level1b")
输出
根据您的输入,这会产生:
"level1a": "value",
"level1b":
"level2a.level3a": "nestedvalue",
"level2b": "value"
【讨论】:
以上是关于如何将 JSON 对象的嵌套部分转换为点链式平面 JSON?的主要内容,如果未能解决你的问题,请参考以下文章
我如何将平面数据框转换为 spark(scala 或 java)中的嵌套 json
使用 python 将嵌套 json 转换为平面 json 时遇到困难
使用jolt变换并将平面json转换为复杂的嵌套json数组