繁体   English   中英

如何使用jq对对象进行扁平化的逆运算?

[英]How to get inverse operation of flatten for objects using jq?

通过另一个 SO 线程,我发现了如何使用 jq 来“展平”JSON。 我正在寻找如何做相反的事情,即“展开”它。

原始 JSON 在层次结构中具有混合级别,例如:

{
  "X1": {
    "X1o1": {
      "X1o1o1": "abc",
      "X1o1o2": "def"
    },
    "X1o2" : {
      "X1o2o1" : "ghi",
      "X1o2o2": "jkl"
    },
    "X1o3": "mno"
  },
  "X2": "pqr"
}

正如https://jqplay.org/s/Eo6h_3V8PO所示,为了与其他同事一起工作,我需要使用“展平”该结构 ()

reduce (tostream|select(length==2)) as $i ({}; .[[$i[0][]|tostring]|join("_")] = $i[1] )

生产:

{
  "X1_X1o1_X1o1o1": "abc",
  "X1_X1o1_X1o1o2": "def",
  "X1_X1o2_X1o2o1": "ghi",
  "X1_X1o2_X1o2o2": "jkl",
  "X1_X1o3": "mno",
  "X2": "pqr"
}

我需要帮助的是如何使用jq将这样的 output JSON 转换回原始形式?

我看到split仅适用于字符串,如tostring | split("_") tostring | split("_")

任何指导我正确方向的指示和/或示例将不胜感激。

使用您的示例输入,过滤器:

reduce to_entries[] as $kv ({}; setpath($kv.key|split("_"); $kv.value))

生产:

{
  "X1": {
    "X1o1": {
      "X1o1o1": "abc",
      "X1o1o2": "def"
    },
    "X1o2": {
      "X1o2o1": "ghi",
      "X1o2o2": "jkl"
    },
    "X1o3": "mno"
  },
  "X2": "pqr"
}

您可能想了解两种工具。 第一个是名为gron的程序,它可以将 JSON 展平为有效的 JavaScript(可以展平回原始 JSON)。 它会把你的原件变成这样:

$ gron /tmp/foo.json
json = {};
json.X1 = {};
json.X1.X1o1 = {};
json.X1.X1o1.X1o1o1 = "abc";
json.X1.X1o1.X1o1o2 = "def";
json.X1.X1o2 = {};
json.X1.X1o2.X1o2o1 = "ghi";
json.X1.X1o2.X1o2o2 = "jkl";
json.X1.X1o3 = "mno";
json.X2 = "pqr";

并将其展开为 JSON:

$ gron /tmp/foo.json | gron -u
{
  "X1": {
    "X1o1": {
      "X1o1o1": "abc",
      "X1o1o2": "def"
    },
    "X1o2": {
      "X1o2o1": "ghi",
      "X1o2o2": "jkl"
    },
    "X1o3": "mno"
  },
  "X2": "pqr"
}

第二个是名为jqg的 Bash 脚本,使用jq可获得类似的结果; 它的中间(扁平化)格式有效 JSON:

$ jqg . /tmp/foo.json
{
  "X1.X1o1.X1o1o1": "abc",
  "X1.X1o1.X1o1o2": "def",
  "X1.X1o2.X1o2o1": "ghi",
  "X1.X1o2.X1o2o2": "jkl",
  "X1.X1o3": "mno",
  "X2": "pqr"
}

展开成原来的样子:

$ jqg . /tmp/foo.json | jqg -u
{
  "X1": {
    "X1o1": {
      "X1o1o1": "abc",
      "X1o1o2": "def"
    },
    "X1o2": {
      "X1o2o1": "ghi",
      "X1o2o2": "jkl"
    },
    "X1o3": "mno"
  },
  "X2": "pqr"
}

注意:我是jqg的作者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM