【问题标题】:How can I convert a nested part of a JSON object to dot-chained flat JSON?如何将 JSON 对象的嵌套部分转换为点链式平面 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 级?
  • 我希望能够选择一个键并将其下方的所有内容链接起来,尽可能多的级别。原始键中没有一个点,所以它会保持清楚数据过去的样子。

标签: json elasticsearch path jq flatten


【解决方案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"
  }
}

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2022-11-29
    • 2016-04-03
    相关资源
    最近更新 更多