2010-11-19 2 views
3

여기에 개념 증명을하고 제가 생각했던 것보다 약간 문제가 있습니다. 여기에 내가하고 싶은 것과 내가 현재하고있는 일이있다.json을 구문 분석하고 Sinatra 및 DataMapper를 사용하여 해당 데이터를 데이터베이스에 쓸 수 있습니까?

아래의 간단한 메시지가 포함 된 json 파일을 Sinatra 앱에 보내고 있습니다.

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

나는 내가 PARAMS을 내가 타임 스탬프와 ID가하지만 데이터베이스에 저장되어있는 메시지를 보낼 때 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 

에 기록하기 위해 사용하고 게시물을 거기에서 제목과 메시지는 없습니다.

무엇이 누락 되었습니까?

감사

편집 :

C : 지금은 내 응용 프로그램을 실행하고 나는이 오류를 얻을 그것을 JSON 파일을 보낼 때

/사용자/규범/루비/Ruby192/lib 디렉토리/루비 /1.9.1/webrick/server.rb:183:in`block in start_thread ' TypeError : 해시를 문자열로 변환 할 수 없습니다.

편집 2 : 약간의 성공.

위의 json은 json이 게시되는 방식 인 test.json이라는 파일 호출에 있습니다. 파일을 게시하기 위해 나는 HttpClient를 사용 : 좀 더 그것에 대해 생각하면

require 'httpclient' 

HTTPClient.post 'http://localhost:4567/note', [ :file => File.new('.\test.json') ] 

을, 나는 파일이 내가 그것을 다른 방식으로 전송 시도 문제였다 게시 생각했다. 아래의 예는 한 번 일을 나는 변화를 n에 내 게시물/노트 핸들 :

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은 매우 간단합니다 :

시작을 평소와 같이 그것을 필요로. 당신이 1.9+ 루비에하지 않으면 require '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에서 필드를 검색하면됩니다.

+0

해시 및 json에 대한 귀하의 설명에 감사드립니다. 매우 도움이됩니다. – Norm

+0

'params'가 잘 작동하는 JSON 데이터 스트림 인 경우. –

+0

Arrgggg. – Norm

관련 문제