从文件中读取多个JSON对象

时间:2016-01-10 22:03:24

标签: ruby json io

我正在尝试编写一个程序,该程序接受用户输入并将其写入JSON文件以便稍后读取。在这之前,我将用户输入并创建一个哈希并将其转换为JSON格式,然后再将其写入文件。当我有多个需要从文件中读取的JSON对象时,我的问题就出现了。

这是我当前的代码,用于创建哈希并将数据移动到文件中以及我用来从文件中读取的方法。

#create hash of user input
tempHash = {
:first_name => $user_fname, 
:last_name => $user_lname,
:raw_date => input_date,
:birthday => $user_bday
}

#open birthday_output.json file and write the JSON object to file
File.open("#{@filePath}/birthday_output.json", 'a+') do |file|
    file.puts JSON.pretty_generate(tempHash)
    file.close
end

#read the JSON object from file and return value of specific key
def file_reader(key)
    file = File.read("#{@filePath}/birthday_output.json")
    data_hash = JSON.parse(file)
    return data_hash[key]
end

当我在我尝试读取的文件中只有一个JSON对象时,这一切都很有用,但是当我创建另一个JSON对象并将其写入文件时,我在尝试解析文件时收到下面列出的错误。我的目标是创建一个包含用户输入的文件,然后读取这些键/值以查看用户输入是否已存在于文件中。

我收到的错误是

"in 'parse': 776: Unexpected token at ' JSON Parser error
"first_name": "Jon"
"last_name": "Stewart"
"raw_date": "2016-06-11"
"birthday": "June 11 2016"

当我收到错误时,我的文件看起来像这样:

{
"first_name": "Hank",
"last_name": "Hill",
"raw_date": "2016-01-05",
"birthday": "January 05 2016"
}
{
"first_name": "Jon",
"last_name": "Stewart",
"raw_date": "2016-06-11",
"birthday": "June 11 2016"
}    

同样,当文件中只存在Hank Hill JSON对象时,我能够使用我感兴趣的密钥调用我的file_reader方法,并且输出正确。当我将第二个JSON对象引入文件“Jon Stewart”时,它会向我发起错误。有没有人有我的经验?

1 个答案:

答案 0 :(得分:1)

我建议让文件包含一个json对象列表,以便它是

[
  {
    "first_name": "Hank",
    "last_name": "Hill",
    "raw_date": "2016-01-05",
    "birthday": "January 05 2016"
  },
  {
    "first_name": "Jon",
    "last_name": "Stewart",
    "raw_date": "2016-06-11",
    "birthday": "June 11 2016"
  }
]

这样,您的文件中就有了一个有效的JSON列表,您可以让json解析器完成所有工作。你不想手动找出对象结束的地方,因为这需要你至少写一个json解析器的子集。

您需要更新代码中的逻辑,以执行诸如将最新条目添加到列表末尾然后将对象作为json转储到文件而不是仅将对象写入文件末尾的操作。