はじめに
こんな感じのファイルがあった
hoge.json
{"id":"1","kana":"あ","boin":"a"
}
{"id":"2","kana":"い","boin":"i"
}
{"id":"3","kana":"う","boin":"u"
}
ここからデータを取りたいと思った。
やってはいけない
最初こんなことをやっていた
suck.rb
require 'json'
json=open('hoge.json'){|io|
JSON.load(io)
}
json.each_line{|line|
puts line['kana']
}
意図としては、パースされたhoge.jsonが変数jsonにオールイン。その後、各行ごとに取り出して必要なkeyのvalueをとってこよう、ということ。
しかしこれをやろうとすると、こんな事を言われてしまう。
.../gems/json-1.8.2/lib/json/common.rb:155:in `parse': 795: unexpected token at '{"id":"2","kana":"い","boin":"i"} (JSON::ParserError)
こうしたら動いた
わけがわからず、「1行目はうまく読んでるみたいだから、2行目の記述がだめなのかな?」とか考えていた。しかし、どう見ても変なところがわからない。
そこで、1行ずつ読んだ後で、読んだ1行をパースすることにした。
こんな感じ。
working.rb
require 'json'
# とりあえず変数fileに展開する
file=open('hoge.json')
# fileを1行読む毎にパースして、その上で出力する
file.each_line { |line|
json=JSON.load(line)
puts json['kana']
}
すると、
$ ruby working.rb
あ
い
$
とうまくいった。
まとめ
一気にパースしてから各行毎に切り出して...みたいなのはダメらしい。
1行毎に読み込んでから行毎にパースして...というのは大丈夫らしい。
イマイチよくわからないけれども、そういうことらしい。
おわり