2016-05-04 1 views
3

Я работаю с скриптом Ruby, который читает файл .json.Текст JSON должен содержать по крайней мере два октета! (JSON :: ParserError)

Вот файл в формате JSON:

{ 
    "feed.xml": "93d5b140dd2b4779edef0347ac835fb1", 
    "index.html": "1cbe25936e392161bad6074d65acdd91", 
    "md5.json": "655d7c1dbf83a271f348a50a44ba4f6a", 
    "test.sh": "9be192b1b5a9978cb3623737156445fd", 
    "index.html": "c064e204040cde216d494776fdcfb68f", 
    "main.css": "21b13d87db2186d22720e8c881a78580", 
    "welcome-to-jekyll.html": "01d7c7d66bdeecd9cd69feb5b4b4184d" 
} 

Это полностью действует, и проверяется на предмет его существования, прежде чем пытаться читать из него. Пример:

if File.file?("md5.json") 
    puts "MD5s exists" 
    mddigests = File.open("md5.json", "r") 
    puts "MD5s" + mddigests.read 
    items = JSON.parse(mddigests.read) <--- Where it all goes wrong. 
    puts items["feed.xml"] 

Все работает до этого момента:

MD5s exists 
MD5s{ 
    "feed.xml": "93d5b140dd2b4779edef0347ac835fb1", 
    "index.html": "1cbe25936e392161bad6074d65acdd91", 
    "md5.json": "655d7c1dbf83a271f348a50a44ba4f6a", 
    "test.sh": "9be192b1b5a9978cb3623737156445fd", 
    "index.html": "c064e204040cde216d494776fdcfb68f", 
    "main.css": "21b13d87db2186d22720e8c881a78580", 
    "welcome-to-jekyll.html": "01d7c7d66bdeecd9cd69feb5b4b4184d" 
} 
common.rb:156:in `initialize': A JSON text must at least contain two octets! (JSON::ParserError) 

Я искал и пробовал много разных вещей, но безрезультатно. Я в тупике. Благодаря!

+0

Это все еще происходит, если вы закомментируете первый middigests.read? – Ian

ответ

6

У вас есть дублированный звонок read() в том месте, где все идет не так. Замените второй вызов на read() с переменной mddigests, и все должно быть хорошо.

Этот код должен работать, как и следовало ожидать:

if File.file?("md5.json") 
    puts "MD5s exists" 
    mddigests = File.open("md5.json", "r") 
    digests = mddigests.read 
    puts "MD5s" + digests 
    items = JSON.parse(digests) #<--- This should work now! 
    puts items["feed.xml"] 
end 

Причина в том, что указатель файла перемещается после первого read(), а второй read(), это в конце файла, следовательно, сообщение, требующее не менее 2 октетов.

+0

Большое вам спасибо! Это странно, но я думаю, что как работает рубин :) –