使用jq从JSON对象中删除键:值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用jq从JSON对象中删除键:值相关的知识,希望对你有一定的参考价值。

我正在尝试使用jq从JSON对象添加和删除'key:value'。我是新的使用jq,我不明白jq向我投掷的错误,所以任何帮助推动我正确的方向非常感谢。我的具体问题是我有一个JSON对象(下面),我希望能够从JSON对象添加/删除“maxHeight”键/值。

我试过的一些命令我得到的错误......

jq 'recurse(.[]) |= del(.maxHeight)' new.json   

无法迭代null(null)

 jq 'recurse(.[]) |= {maxHeight}' new.json

无法迭代字符串(“功能”)

jq 'recurse(.[]) |= .maxHeight' new.json 

不能用字符串“style”索引字符串

new.json文件看起来像这样......

{
  "style": {
    "className": "feature",
    "showLabels": false,
    "color": "function(feature, variableName, glyphObject, track){if(feature.get("type") === "CDS"){return "#9CFBF5";} else if(feature.get("type") === "exon"){return "#43A47F";} else if(feature.get("type") === "intron"){return "#E8E8E8";} else if(feature.get("type") === "five_prime_UTR"){return "#F192FE";} else if(feature.get("type") === "three_prime_UTR"){return "#FEC892";} else {return "#FF0000";}}",
    "arrowheadClass": null,
    "featureCss": "padding:3px;"
  },
  "menuTemplate": [
    {
      "label": "View details"
    },
    {
      "label": "Highlight a gene"
    },
    {
      "iconClass": "dijitIconBookmark",
      "content": "function(track,feature,div) { window.parent.angular.element(window.frameElement).scope().specificNote( feature[2] ) }",
      "action": "contentDialog",
      "title": "(feature{name})",
      "label": "Create Note"
    }
  ],
  "hooks": {
    "modify": " function(track,feature,div){   var checkArr=["Reference","Missing","Heterozygous","NonReference"];for(var i=0;i<feature.length;i++){for(var j=0;j<checkArr.length;j++){  if( i>3) { if( feature[i] ===  checkArr[j] ) {  if(feature[i]=="NonReference"){div.style.backgroundColor="red"}else if(feature[i]=="Reference"){div.style.backgroundColor="green"}else if(feature[i]=="Heterozygous"){div.style.backgroundColor="orange"}else if(feature[i]=="Missing"){div.style.backgroundColor="grey"} }}}}} "
  },
  "key": "cucumber_ChineseLong_v2.gff3",
  "storeClass": "JBrowse/Store/SeqFeature/NCList",
  "trackType": null,
  "maxHeight": "200px",
  "urlTemplate": "tracks/cucumber_ChineseLong_v2.gff3/{refseq}/trackData.json",
  "compress": 0,
  "label": "cucumber_ChineseLong_v2.gff3",
  "type": "JBrowse/View/Track/CanvasFeatures"
}
答案

有两种方法:

以下说明了全球方法:

walk(if type == "object" and has("maxHeight") then del(.maxHeight) else . end)

这实际上通过更新具有指定键的任何对象来“编辑”输入。

如果你的jq没有walk/1,只需在调用它之前包含它的def(例如可以从https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq获得)。

另一答案

这是一个从Electrum Wallet JSON文件中删除几个键的示例,这是在zsh和bash中测试的,其中jq的verison没有内置walk

jq -f <(
  curl https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq
  echo 'walk('
  for i in transactions spent_outpoints verified_tx3 txo txi addresses addr_history; do
    echo 'if type == "object" and has("'"$i"'") then del(.'"$i"') else . end |'
  done
  echo '.)'
)  ~/.electrum/testnet/wallets/default_wallet
另一答案

对于非常大的JSON文档,可能最好使用jq的“流解析器”来解决此类问题,至少在编辑操作大大减小文档大小的情况下。无论如何,这是一个使用--stream选项的解决方案:

jq --stream 'select(length == 2 and .[0][-1] == "maxHeight" | not)' new.json |
 jq -n 'fromstream(inputs)'

请注意,必须在第二次调用jq时使用-n选项。

另一答案

我有类似的问题,但不想为此制作大量代码或花费太多时间。

我假设你解决了这个原因。但对我来说,以下工作的价值是我不必递归查找的,即仅在顶层。另外,我不在乎是否有空白/空值:

jq "if .maxHeight then .maxHeight = null else . end "

以上是关于使用jq从JSON对象中删除键:值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jq 从 JSON 中获取键名

sh 使用jq从多个JSON文件的“对象”键合并数组

使用 jq 保留键名展平 JSON

使用 jq 一次删除多个键

使用 jq 从 JSON 文件中递归获取键名

如何删除json对象键和值。?