4

JSON データを返す Web サービスを呼び出す小さな bash プログラムがあります。

私は自分で webservice プログラムを作成しました。そのデータ ソースを完全に制御できるので、返されるデータを信頼できます。

今、私はデータを使って何かをしたいと思っています。

データは、ネストのない単純な短いキーと値の構造で、次のようになります。

{
  "asciifile" : "../tmp/data_20120720_105746-01580.txt",
   "excelfile" : "../tmp/data_01580-20120720_105746.xlsx",
   "from" : "Jun 19, 2012",
   "msg" : "some info message, for the admin",
   "outfile" : "data--recent.txt",
   "outfile_excel" : "data--recent.txt.xlsx",
   "resolution" : "std"
   "to" : "Jul 20, 2012",
   "url_comment" : "another info message, for the screen/user",
   "url_outfile" : "http://www.example.com/path/tmp_cached_files/data--recent.txt",
   "url_outfile_excel" : "http://www.example.com/path/tmp_cached_files/data--recent.txt.xlsx",

}

現在、このワンライナーを使用して、返された json 構造を perl コードに逆シリアル化しています。このスニペットの最後の行を参照してください。

#!/bin/bash
cmd=$(curl_or_wget_call_to_webservice)
output=$(eval $cmd)
outfile_excel=$(echo "$output"| json_xs -f json -t dumper | tee | perl -n0777 -E 'eval  "%h=%{$_}"; warn $@ if $@; say $h{outfile_excel}')

たとえば、%{$_} コンストラクトを思いついた理由がわかりません。これを行うより良い方法はありますか?最後の行を書くためのより短い方法またはより安全な方法はありますか?

SE 編集者: 必要に応じて、この投稿を codereview stackexchange サイトに移動できますが、私はそこにアカウントを持っていません。

編集: 8 か月後に投稿を再訪した後、最近、この 1 つのライナーを使用して github リポジトリの名前を取得していることを追加したいと思います。

 wget --quiet --auth-no-challenge --user knbknb --password secret  -O -
 https://api.github.com/user/repos |  
 perl  -MJSON -n0777 -E '$r = decode_json($_); map {say $_->{name}} @$r' -
4

2 に答える 2

5

Perl は JSON 自体をデコードできるので、次は LWP::Simple を使用して json データを取得する方法について説明します。

perl -MLWP::Simple -MJSON \
-e '$ref = decode_json(get("http://your.url/to/webservice")); print $ref->{outfile_excel}'

$ref には、すべての JSON データの perl 構造が含まれています。必要に応じて出力してください。

于 2012-07-20T14:07:11.227 に答える
3

jshonがあります。あなたは単に次のようなものを呼び出すことができます

curl http://somehere.tld/data.json | jshon -e url_outfile_excel

これにより、指定されたキーの値が出力されます。

ところで。Webサービスを制御できるからといって、入力が信頼できるものになるわけではありません。を呼び出すときは注意してくださいeval

于 2012-07-20T11:58:03.780 に答える