如何将 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数组

将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)

平面 json 到嵌套 json python