1

我有一个这样的json文件

{
    "log": {
            "version": {
                    "$t": "1.1"
            },
            "creator": {
                    "name": {
                            "$t": "Internet Explorer Network Inspector"
                    },
                    "version": {
                            "$t": "10.0.9200.17229"
                    }
            }
}

我需要展平文件,所以它应该读

{
    "log": {
            "version": "1.1",
            "creator": {
                    "name": "Internet Explorer Network Inspector",
                    "version": "10.0.9200.17229"
            }
}

我知道过滤器{"version": .version ."$t"}将单个元素减少"version": {"$t": "10.0.9200.17229"}到,{"version": "10.0.9200.17229"}但是这个过滤器应该递归地应用于任何级别的任何元素。

4

3 回答 3

2

您可以通过定义一个新函数来创建递归过滤器:

def untag: (objects | ."$t")
    // (objects | with_entries(.value |= untag))
    // (arrays | map(untag))
    // .
    ;
untag

所以给定这样的输入:

{
  "log": {
    "version": {
      "$t": "1.1"
    },
    "creator": {
      "name": {
        "$t": "Internet Explorer Network Inspector"
      },
      "version": {
        "$t": "10.0.9200.17229"
      }
    }
  }
}

你会回来:

{
  "log": {
    "creator": {
      "name": "Internet Explorer Network Inspector",
      "version": "10.0.9200.17229"
    },
    "version": "1.1"
  }
}
于 2015-03-11T18:33:11.783 回答
0

如果你的 jq 有walk,你可以按如下方式使用它,如果没有,你可以轻松地谷歌它的 def 并通过剪切和粘贴来包含它:

walk( if type=="object" and has("$t")
      then .["$t"] else . end )
于 2018-06-14T12:10:31.130 回答
0

扩展@JeffMercado 的出色答案:

问题

您有一些生成 JSON 的命令,其中字符串值表示如下

{"some key": {"$t": "some string value"}}

并且您想将其转换为如下所示:

{"some key": "some string value"}

解决方案

把它放在你的~/.jq文件中:

def untag: (objects | ."$t")
  // (objects | with_entries(.value |= untag))
  // (arrays | map(untag))
  // .
  ;

像这样使用它:

some_command | jq untag

例子:

$ echo '{"some key": {"$t": "some string value"}}' | jq
{
  "some key": {
    "$t": "some string value"
  }
}

$ echo '{"some key": {"$t": "some string value"}}' | jq untag
{
  "some key": "some string value"
}
于 2018-07-26T16:30:34.627 回答