如何将 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"
  }
}