我如何解析json并使用Sinatra和DataMapper将数据写入数据库
我在这里做了一个概念验证的事情,比我想的要麻烦一点。这是我想要做的以及我目前如何做的。我如何解析json并使用Sinatra和DataMapper将数据写入数据库
我发送我的Sinatra应用程序一个json文件,其中包含下面的简单信息。
[
{
title: "A greeting!",
message: "Hello from the Chairman of the Board"
}
]
从那里我有我使用采取PARAMS并将它们写入SQLite数据库
post '/note' do
data = JSON.parse(params) #<---EDIT - added, now gives error.
@note = Note.new :title => params[:title],
:message => params[:message],
:timestamp => (params[:timestamp] || Time.now)
@note.save
end
当我送然而时间戳和ID保存到数据库中的消息后标题和消息是零。
我错过了什么?
感谢
编辑:
现在,当我跑我的应用程序,并将其发送JSON文件中我得到这个错误:
C:/用户/规范/红宝石/ Ruby192/lib中/红宝石/1.9.1/webrick/server.rb:183:in`block in start_thread' TypeError:无法将哈希转换为字符串
编辑2:一些成功。
我有一个文件调用test.json中的json将被张贴的方式上面的json。为了发布文件我用了HTTPClient:
require 'httpclient'
HTTPClient.post 'http://localhost:4567/note', [ :file => File.new('.\test.json') ]
想着它多一些,我想发布的文件是问题,所以我试图发送一个不同的方式。下面的示例工作,一旦我改变了我的ň后/注手柄这样的:
data = JSON.parse(request.body.read)
我的新send.rb
require 'net/http'
require 'rubygems'
require 'json'
@host = 'localhost'
@port = '4567'
@post_ws = "/note"
@payload ={
"title" => "A greeting from...",
"message" => "... Sinatra!"
}.to_json
def post
req = Net::HTTP::Post.new(@post_ws, initheader = {'Content-Type' =>'application/json'})
#req.basic_auth @user, @pass
req.body = @payload
response = Net::HTTP.new(@host, @port).start {|http| http.request(req) }
puts "Response #{response.code} #{response.message}:
#{response.body}"
end
thepost = post
puts thepost
所以我越来越近。感谢所有帮助到目前为止。与需要它像往常一样
开始:
西纳特拉不会自动解析JSON你,但幸运的是解析JSON是非常简单的。 require 'rubygems'
如果你不上的Ruby 1.9+:
>> require 'json' #=> true
>> a_hash = {'a' => 1, 'b' => [0, 1]} #=> {"a"=>1, "b"=>[0, 1]}
>> a_hash.to_json #=> "{"a":1,"b":[0,1]}"
>> JSON.parse(a_hash.to_json) #=> {"a"=>1, "b"=>[0, 1]}
这是一个往返使用,以创建,然后解析一些JSON。 IRB输出显示散列并将嵌入数组转换为JSON,然后解析回散列。你应该能够根据你的邪恶需求来打破这一点。
要获取字段,我们将打破上面的示例多一点,并假装我们已从您的连接的远程端收到JSON。所以,下面的received_json
是传入的数据流。将它传递给JSON解析器,您将获得一个Ruby数据哈希。访问的散列,你通常会和你得到的值:
>> received_json = a_hash.to_json #=> "{"a":1,"b":[0,1]}"
>> received_hash = JSON.parse(received_json) #=> {"a"=>1, "b"=>[0, 1]}
>> received_hash['a'] #=> 1
>> received_hash['b'] #=> [0, 1]
传入的JSON可能是您的params[]
哈希参数,但我不知道它会被藏在哪些关键,所以你需要弄清楚。它可能被称为'json'
或'data'
,但这是特定于应用程序。
您的数据库代码看起来没问题,而且如果您看到一些写入数据的数据,则必须正常工作。它看起来像你只需要从JSON中检索字段。
Greg感谢您对哈希和json的解释。非常有帮助。 – Norm 2010-11-19 16:06:49
如果'params'是可以正常工作的JSON数据流。 – 2010-11-19 16:16:24
Arrgggg。我得到一个“不能转换成字符串”的错误“我要去吃午餐了。 – Norm 2010-11-19 16:40:23