如何将 JSON 对象的嵌套部分转换为点链平面 JSON?
How can I convert a nested part of a JSON object to dot-chained flat JSON?
我想要这个:
{
"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,以便在保留所有字段的同时保持较低的字段总数信息。
有什么想法吗?
你显然已经知道问题第二部分的解决方案,所以这是第一部分的解决方案:
# 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"
}
}
我想要这个:
{
"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,以便在保留所有字段的同时保持较低的字段总数信息。
有什么想法吗?
你显然已经知道问题第二部分的解决方案,所以这是第一部分的解决方案:
# 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"
}
}