0

JSONの2つのパラメーター(「local_delivery_time」と「tubelines」)を使用して(私が制御できないAPIサーバーからの)GET呼び出しに応答するパブリケーションをRuby/Sinatraで構築しています。現時点では、呼び出しの例は次のとおりです。

http://my.herokuapp.com/edition/?local_delivery_time=0012-11-02T21:00:00+00:00&tubelines=%7B%22Bakerloo%22=%3E%220%22,%20%22Central%22= %3E%220%22、%20%22Circle%22 =%3E%220%22、%20%22District%22 =%3E%220%22、%20%22DLR%22 =%3E%220%22、% 20%22Hammersmith%20and%20City%22 =%3E%220%22、%20%22Jubilee%22 =%3E%220%22、%20%22Metropolitan%22 =%3E%221%22、%20%22Northern% 22 =%3E%220%22、%20%22Overground%22 =%3E%221%22、%20%22Piccadilly%22 =%3E%220%22、%20%22Victoria%22 =%3E%220%22 、%20%22Waterloo%20and%20City%22 =%3E%220%22%7D

したがって、URIからエンコードされていない場合、「tubelines」パラメーターはRubyハッシュとして送信されます(私は信じますか?)。

{"Bakerloo" => "0"、 "Central" => "0"、 "Circle" => "0"、 "District" => "0"、 "DLR" => "0"、 "Hammersmith and City "=>" 0 "、"ジュビリー "=>" 0 "、"メトロポリタン "=>" 1 "、"北部 "=>" 0 "、"オーバーグラウンド "=>" 1 "、"ピカデリー "=>" 0 "、" Victoria "=>" 0 "、" Waterloo and City "=>" 0 "}

しかし、この.eachコードを実行しようとすると(値が「1」のキーを別の配列にプッシュするため)。

tubelines.each do |key, value|
    if value == "1"
        @selectedlines.push(key)
    end
end

このエラー「NoMethodError-undefinedmethod`each'for#」が表示され、引用符がエスケープされたハッシュが表示されます。このような;

{\" Bakerloo \ "=> \" 0 \ "、\" Central \ "=> \" 0 \ "、\" Circle \ "=> \" 0 \ "、\" District \ "=> \" 0 \ "、\" DLR \ "=> \" 0 \ "、\" Hammersmith and City \ "=> \" 0 \ "、\" Jubilee \ "=> \" 0 \ "、\" Metropolitan \ "= > \ "1 \"、\ "Northern \" => \ "0 \"、\ "Overground \" => \ "1 \"、\ "Piccadilly \" => \ "0 \"、\ "Victoria \ "=> \" 0 \ "、\" Waterloo and City \ "=> \" 0 \ "}

呼び出しの形式を変更できないので、エスケープされた引用符を処理してハッシュを使用するにはどうすればよいですか?JSONを使用して解析しようとしましたが、パーサーはエスケープされた引用符で同じ問題を抱えているようで(予期しないトークンエラーが返されます)、まったく同じハッシュを手動で入力すると、コードは完全に機能します。

JSONオブジェクトとエスケープされた引用符のエンコードについて多くの質問を見てきましたが、JSONオブジェクトを受け取ったり呼び出したりするときにエスケープされた引用符を処理することについては何も見つかりませんでした...

4

1 に答える 1

0

私はこれについてFrederickCheungと一緒です、それはデータを送信するためのめちゃくちゃな方法です。代わりにPOSTリクエストでJSONを送信してもらうのはどうですか?処理がはるかに簡単です。

post "/edition", :provides => :json do
  data = JSON.parse params["data"]
  local_delivery_time = data["local_delivery_time"]
  tubelines = data["tubelines"]
  # do something here...
end

POSTリクエストを送信するだけで、「data:」キーのすべてのデータが送信されます。

GETでも機能する可能性はありますが、主なことは、URLにクレイジーなものを送信しないことです。これは、人生を困難にするだけです。サーバーを実行している人々にそれを伝えることを楽しんでいただけると確信しています。:)

于 2012-11-10T00:44:06.807 に答える