ruby - 如何使用 Sinatra 和 DataMapper 解析 json 并将该数据写入数据库

标签 ruby json sinatra datamapper

我正在这里进行概念验证,遇到的麻烦比我预想的要多一些。这是我想做的事情以及我目前正在做的事情。

我正在向我的 Sinatra 应用程序发送一个 json 文件,其中包含以下简单消息。

[ 
        { 
        title: "A greeting!",
        message: "Hello from the Chairman of the Board" 
         }
]

从那里我有一个帖子,我用它来获取参数并将它们写入 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:/Users/Norm/ruby/Ruby192/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread' TypeError: 无法将 Hash 转换为 String

编辑 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

所以我越来越近了。感谢迄今为止的所有帮助。

最佳答案

Sinatra 不会自动为您解析 JSON,但幸运的是解析 JSON 非常简单:

像往常一样开始要求它。 如果你没有使用 Ruby 1.9+,则需要 'rubygems':

>> 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 中检索字段。

关于ruby - 如何使用 Sinatra 和 DataMapper 解析 json 并将该数据写入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4226128/

相关文章:

jquery - 如何在 Django View 中使用 ajax POST 解析 json 数据

json - 请求失败时从 AlamoFire 获取 JSON 响应

ruby - bundle 的 gem 和 datamapper 的问题 : conflict with muti_json version?

ruby - 删除 Sinatra 应用程序中的默认路由日志记录

ruby - 将 Sinatra 应用程序部署到暂存环境时出现问题

ruby-on-rails - 如何运行 Vacuum 等 gem 的示例代码?

Ruby 默认赋值 ( ||= ) 与拯救错误

ruby-on-rails - 可以捕获调试器语句的 ruby​​ 代码质量检查器

sql - Ruby 构建 .where 超过两个类

c# - 使用 json.net 反序列化静态属性?