如何将JSON对象的嵌套部分转换为点链式平面JSON?

时间:2019-02-09 16:37:39

标签: json elasticsearch path jq flatten

我想要这个:

{
    "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中,以便在保持所有信息的同时保持字段总数少。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您显然已经知道问题第二部分的解决方案,所以这里是第一部分的解决方案:

# 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"
  }
}