1

ルビーとjsonに問題があります。インターネットから情報を取得したjsonファイルがあります。次の問題では、次の構文を持つハードコードされたファイルを使用します。

[{
  "day": "20120827_234558",
  "entries": [
    {
      "rank": "3",
      "club": "SuS Schalke 1896 e.V.",
      "votes": "126"
    },
    {
      "rank": "4",
      "club": "TuS Hamborn-Neumühl 07 e.V.",
      "votes": "120"
    }
]
},{
  "day": "20120827_234700",
  "entries": [
    {
      "rank": "1",
      "club": "TLV Germania 1901 Essen-Überruhr",
      "votes": "210"
    },
    {
      "rank": "2",
      "club": "Rumelner TV",
      "votes": "141"
    }
]
}]

次に、ファイルからjsonをロードしてハッシュに入れ、インターネットからいくつかの情報をフェッチし(この例ではハードコーディングされています)、これらの新しい情報をハッシュに追加し、ハッシュをjsonに変換するrubyスクリプトを作成しました。それをファイルに再度保存します。

require 'rubygems'
require 'open-uri'
require 'json'

fname = 'ranking.json'

json = JSON.load(File.open(fname))

json.each do |ranking|
  puts 'entry:'
  puts ranking['day']
end

puts "\n";

new_data = Array.new
new_data = { "day" => "20120828_234558", "entries" => "sgankhask" }
json << new_data.to_json

json.each do |ranking|
  puts 'entry:'
  puts ranking['day']
end

つまり、既存のjsonにjson形式のデータを追加するだけです。

しかし、このスクリプトを実行すると、次の出力が得られます。

entry:
20120827_234558
entry:
20120827_234700

entry:
20120827_234558
entry:
20120827_234700
entry:
day

私は最後の行について混乱しています。最後の行を。と仮定しましたentry: 20120828_234558。Rubyは値( '20120828_234558')ではなくハッシュのキー('day')を取得しているようです。

スクリプトの何が問題になっていますか?どんな助けでも大歓迎です。

4

2 に答える 2

4

JSONは、データ構造を表すための文字列形式です。Rubyでは、これらのデータ構造はハッシュ(辞書またはマップと呼ばれることもあります)や配列などで表されます。

最後に追加する項目new_dataをto_json最初に呼び出して、JSON形式の文字列に変換します。したがって、データは次のようになります。

[{"day"=>"20120827_234558",
  "entries"=>
   [{"rank"=>"3", "club"=>"SuS Schalke 1896 e.V.", "votes"=>"126"},
    {"rank"=>"4", "club"=>"TuS Hamborn-Neumühl 07 e.V.", "votes"=>"120"}]},
 {"day"=>"20120827_234700",
  "entries"=>
   [{"rank"=>"1", "club"=>"TLV Germania 1901 Essen-Überruhr", "votes"=>"210"},
    {"rank"=>"2", "club"=>"Rumelner TV", "votes"=>"141"}]},
 "{\"day\":\"20120828_234558\",\"entries\":\"sgankhask\"}"]

最後の項目が実際にはハッシュではなく文字列であることがわかりますか?したがって、と言うときranking['day']、それはそのキーのハッシュを要求するのでは'day'なく、文字列にサブ文字列を要求し'day'ます。これが、間違った値を出力する理由です。

一般に、このようなデータについて混乱している場合は、このp方法を使用できます。puts人間が読むのと同じように出力しますがp、データとして表現する方法で出力します。たとえば、p jsonそれらを印刷したループの前に追加することで、これを理解しました。

では、いつJSONを使用しますか?データをファイルにシリアル化する準備ができたら。


また、ファイルを開いたが、決して閉じなかったため、これを行う方がよいことに注意してくださいjson = JSON.load(File.read fname)(さらに、見た目がすっきりします)。

また、new_data = Array.new次の行でハッシュに設定しているため、実際には何もしません。

于 2012-08-27T23:16:51.477 に答える
3

主な問題は、次の行に関係しています。

new_data = Array.new
new_data = { "day" => "20120828_234558", "entries" => "sgankhask" }
json << new_data.to_json

JSONをロードすると、それはルビー配列になります。JSONデータ型などではありません。

上記のステートメントは、new_dataを文字列(to_json)として追加します。

次のことを行う必要があります。

new_data = { "day" => "20120828_234558", "entries" => "sgankhask" }
json << new_data

それはうまくいくはずです。

ところで、それを吹き飛ばしてハッシュとして割り当てる場合は、new_dataをArray.newとして割り当てるのは無意味です。

于 2012-08-27T23:16:43.247 に答える