将JSON对象转换为URL查询字符串的命令行

4
我正在寻找一个命令行界面,可以将JSON对象转换为URL查询字符串:
{
  "action_name": "Example",
  "idsite": 1,
  "rec": 1,
  "r": 345007,
  "h": 22,
  "m": 58,
  "s": 47,
  "url": "http://example.com",
  "_id": "44ebfeb79a5bb5e6",
  "_idts": 1539806328,
  "_idvc": 1,
  "_idn": 0,
  "_refts": 0,
  "_viewts": 1539806328,
  "send_image": 1,
  "cookie": 1,
  "res": "412x732",
  "gt_ms": 266,
  "pv_id": "bQkkXv"
}

结果会像这样:
curl -Gi 'http://127.0.0.1:8000/piwik.php?action_name=Example&idsite=1&rec=1&r=345007&h=22&m=58&s=47&url=http%3A%2F%2Fexample.com%2F&_id=44ebfeb79a5bb5e6&_idts=1539806328&_idvc=1&_idn=0&_refts=0&_viewts=1539806328&send_image=1&cookie=1&res=412x732&gt_ms=266&pv_id=bQkkXv'

1
我知道Matomo/Piwik有VisitorGenerator插件。我只是用这段代码作为示例。 - Bruno Wego
2
我也在寻找类似的东西。 - Andrew
请注意:在您的问题中,查询字符串中可能会有额外的“%2F”(或者在JSON字段“url”中缺少“/”); - Julien
2个回答

2
您可以使用以下筛选器与 jq[to_entries[] | (@uri "\(.key)" + "=" + @uri "\(.value)")] | join("&") 该筛选器将生成一个 URI 编码的查询字符串,其中包含所有键值对。
$ jq -r '[to_entries[] | (@uri "\(.key)" + "=" + @uri "\(.value)")] | join("&")' << JSON
{
    "var1":"value 1",
    "another var":"Some value with special & = [ ] chars"
}
JSON
var1=value%201&another%20var=Some%20value%20with%20special%20%26%20%3D%20%5B%20%5D%20chars

请访问https://jqplay.org/s/lu0TAWF2HHf以查看实时演示。

过滤空/ null值

在jq筛选器前加上with_entries(select(.value | length !=0)) |

https://jqplay.org/s/6jQpPs5EepJ


1
你可以使用
xidel -se 'request-combine("http://127.0.0.1:8000/piwik.php",{"action_name":"Example",...})/url'

这句话的意思是:“不清楚你使用的操作系统是什么。如果你使用的是Windows系统,则使用交换引号:”。
xidel -se "request-combine('http://127.0.0.1:8000/piwik.php',{'action_name':'Example',...})/url"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接