0

JSONを返すSinatraアプリを開発しています。

  get '/clients' do

     # do stuff

     response = {
       "success" => "true",
       "msg" => "Clients successfully retrieved",
       "data" => {"clients" => @current_user.clients}
     }
     return response.to_json
  end

返される JSON は次のようになります。

{"success":"true","msg":"Clients successfully retrieved","data":{"clients":[{"client":{"created_at":"2013-03-31T22:50:18Z","email":"test@test.com","first_name":"Marge","gender":"F","hairdresser_id":2,"id":1,"surname":"Simpson","updated_at":"2013-03-31T22:50:18Z"}}]}}

コピーして JSON パーサーに貼り付けると、正常に動作します。 http://json.parser.online.fr/

しかし、irb を起動して使用しようとすると、大量のエラーが発生します。

1.9.3-p286 :001 > a = {"success":"true","msg":"Clients successfully retrieved","data":{"clients":[{"client":{"created_at":"2013-03-31T22:50:18Z","email":"test@test.com","first_name":"Marge","gender":"F","hairdresser_id":2,"id":1,"surname":"Simpson","updated_at":"2013-03-31T22:50:18Z"}}]}}
SyntaxError: (irb):1: syntax error, unexpected ':', expecting tASSOC
a = {"success":"true","msg":"Clients success...
           ^
(irb):1: syntax error, unexpected ',', expecting $end
a = {"success":"true","msg":"Clients successfully r...
                  ^
  from /home/[me]/.rvm/rubies/ruby-1.9.3-p286/bin/irb:13:in `<main>'
1.9.3-p286 :002 > 

洞察を提供できる人はいますか?私は何か間違ったことをしていますか?

どうもありがとう

4

2 に答える 2

2

問題

JSON は有効な Rubyハッシュを構成しません。JSON#parseで解析する必要があるのは String です。

解決

JSON を一重引用符または Ruby 引用符リテラルで囲むことにより、JSON を文字列として解析します。例えば:

JSON.parse %q/{"success":"true","msg":"Clients successfully retrieved","data":{"clients":[{"client":{"created_at":"2013-03-31T22:50:18Z","email":"test@test.com","first_name":"Marge","gender":"F","hairdresser_id":2,"id":1,"surname":"Simpson","updated_at":"2013-03-31T22:50:18Z"}}]}}/
=> {"success"=>"true",
 "msg"=>"Clients successfully retrieved",
 "data"=>
  {"clients"=>
    [{"client"=>
       {"created_at"=>"2013-03-31T22:50:18Z",
        "email"=>"test@test.com",
        "first_name"=>"Marge",
        "gender"=>"F",
        "hairdresser_id"=>2,
        "id"=>1,
        "surname"=>"Simpson",
        "updated_at"=>"2013-03-31T22:50:18Z"}}]}}
于 2013-04-01T12:34:41.470 に答える
0

ハッシュには { key : value } として示されるキーと値のペアがありますが、Ruby は「=>」記号を使用してキーを値にマップします。

「:」を「=>」に置き換えてみると、問題なく動作します。

eg) a = {"success" => "true"}

この Json を Ruby に解析する場合は、次のスニペットを使用します。

require 'json'
value = "{\"val\":\"test\",\"val1\":\"test1\",\"val2\":\"test2\"}"
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}
于 2013-04-01T12:38:14.723 に答える