私はRubyを初めて使用し、しばらくの間これに固執しています。以下に説明するようにJSON応答を受け取り、その部分文字列の値が私が指定したものである部分文字列を検索することを目指しています。
たとえば、次のような応答があります。
{
"00:00:00:CC:00:CC": {
"family": "lladdr"
},
"10.0.0.20": {
"family": "inet",
"prefixlen": "24",
"netmask": "255.255.255.0",
"broadcast": "10.0.0.255",
"scope": "Global"
},
"ff00::f00:00ff:fff0:00f0": {
"family": "inet6",
"prefixlen": "64",
"scope": "Link",
"tags": []
}
}
キーfamily
の値がinet
。に等しい親の値を取得する必要があります。この場合、10.0.0.20
ファミリがinetに等しいときの出力として必要です。
私はここで複数の質問をしました、そしてグーグルは助けませんでした。を使用してJSONを解析し、JSON.parse
検索または選択を使用して回答を取得する必要があることを理解していますが、機能させることができませんでした。
grepまたはawkを使用してBashで行うように、これを実行できる他の方法があるかどうかはわかりません。1つのハックはfoo.[46..54]
、IPを出力するようなものを使用することかもしれませんが、これもこれを解決するための悪い方法だと思います。
ハッシュがJSON#parseを使用して応答としてすでに保存されていると仮定すると、問題を解決する1つの方法は、Hash#invertメソッドを使用してハッシュを反転することです。例えば:
# Return an Array of IPv4, then pop the last/only String value.
response.invert.select { |h| h.values.include? 'inet' }.values.pop
#=> "10.0.0.20"
これはすばやく簡単で、提供されたデータで機能します。ただし、いくつかの小さな注意点があります。
応答ハッシュにIPv4アドレスが1つしかないことを前提としています。inet
値として複数のキーがある場合は、適切と思わpop
れる結果の配列を使用および処理しないでください。例えば:
response.invert.select { |h| h.values.include? 'inet' }.values
#=> ["10.0.0.20"]
各トップレベルのJSONオブジェクトのキーはIPアドレスであると想定しています。私たちは実際には何も検証していません。
お持ちのJSONで機能しますが、任意にネストされたデータ構造やさまざまなデータ構造を解決することはできません。さまざまな種類の入力がある場合は、「何らかの組み立てが必要」と考えてください。
inet
家族がいない場合は、{}.values.pop
nilを返すことがあります。アプリケーションでそれを計画していることを確認してください。
これらはいずれも、特定のユースケースの目玉にはなりませんが、覚えておく価値は確かにあります。あなたのマイレージは異なる場合があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加