2010-11-19 36 views
3

Je fais une preuve de concept ici et j'ai un peu plus de problèmes que je ne le pensais. Voici ce que je veux faire et comment je le fais actuellement.Comment puis-je analyser json et écrire ces données dans une base de données en utilisant Sinatra et DataMapper

J'envoie à mon application Sinatra un fichier json contenant le message simple ci-dessous.

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

De là, j'ai un poste que je me sers de prendre les params et les écrire à la base de données 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 

Lorsque j'envoie le message que l'horodatage et l'identifiant sont enregistrés dans la base de données mais le titre et le message sont nuls.

Qu'est-ce qui me manque?

Merci

Edit:

Maintenant, quand je lance mon application et de l'envoyer le fichier JSON je reçois cette erreur:

C:/Users/Norm/ruby ​​/ Ruby192/lib/ruby /1.9.1/webrick/server.rb:183:in `bloc dans start_thread ' TypeError: impossible de convertir le hachage en chaîne

Édition 2: un certain succès.

J'ai le json ci-dessus dans un appel de fichier test.json qui est la façon dont le json sera posté. Pour afficher le fichier je HTTPClient:

require 'httpclient' 

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

Après y avoir réfléchi un peu plus, je pensais que le fichier était affichait le problème donc j'essayé de l'envoyer d'une manière différente. L'exemple ci-dessous a travaillé une fois que je change ma n poignée poste/note à ceci:

data = JSON.parse(request.body.read) 

Mon nouveau 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 

Je me rapproche. Merci pour toute l'aide jusqu'ici.

Répondre

6

Sinatra ne parse JSON automatiquement pour vous, mais heureusement JSON l'analyse syntaxique est assez simple:

Commencez avec exigeant comme d'habitude. require 'rubygems' si vous n'êtes pas sur 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]} 

C'est une utilisation aller-retour pour créer, puis analyser certains JSON. La sortie IRB montre que le hachage et le tableau incorporé ont été convertis en JSON, puis analysés dans le hachage. Vous devriez être capable de décomposer cela pour vos besoins néfastes. Pour obtenir les champs, nous allons décomposer l'exemple ci-dessus un peu plus et prétendre que nous avons reçu JSON du côté distant de votre connexion. Ainsi, le received_json ci-dessous est le flux de données entrant. Passez-le à l'analyseur JSON et vous obtiendrez un hachage de données Ruby.Accédez au hachage comme vous le feriez normalement et vous obtenez les valeurs suivantes:

>> 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] 

Le JSON entrant est probablement un paramètre dans votre hachage params[] mais je ne suis pas sûr de ce que la clé il se cacher sous, vous aurez donc besoin de comprendre cela. Il peut être appelé 'json' ou 'data' mais c'est une application spécifique.

Le code de votre base de données semble correct et doit fonctionner si vous voyez certaines des données qui y sont écrites. Il semble que vous ayez juste besoin de récupérer les champs du JSON.

+0

Greg merci pour votre explication de hashes et json.Très utile. – Norm

+0

Si 'params' est le flux de données JSON qui fonctionnera correctement. –

+0

Arrgggg. Je reçois une erreur "Impossible de convertir Has en String" "Je vais déjeuner – Norm