2010-11-19 47 views
3

我在這裏做了一個概念驗證的事情,比我想的要麻煩一點。這是我想要做的以及我目前如何做的。我如何解析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 

所以我越來越近。感謝所有幫助到目前爲止。與需要它像往常一樣

開始:

回答

6

西納特拉不會自動解析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中檢索字段。

+0

Greg感謝您對哈希和json的解釋。非常有幫助。 – Norm 2010-11-19 16:06:49

+0

如果'params'是可以正常工作的JSON數據流。 – 2010-11-19 16:16:24

+0

Arrgggg。我得到一個「不能轉換成字符串」的錯誤「我要去吃午餐了。 – Norm 2010-11-19 16:40:23