【问题标题】:Ruby JSON.parse gives unexpected token errorRuby JSON.parse 给出了意外的令牌错误
【发布时间】:2014-12-26 07:56:36
【问题描述】:

我正在用这样的 jQuery 发送一个 POST

   var authorisationType = "payment";

   var paymentData = {
        cardholdername: $("#userCardName").val(),
        cardnumber: $("#userCardNumber").val(),
        expmonth: $("#userExpMonth").val(),
        expyear: $("#userExpYear").val(),
        cvv:$("#userCVV").val(),
        amount: "$15.00"
    }

    var postData = new Object();
    postData.username = username;
    postData.type = authorisationType;
    postData.data = paymentData;

    var authorisationType = "payment";

    console.log("sending username and token to server");
    $.ajax({
       type: 'POST',
       url: url,
       data: JSON.stringify(postData), 
       contentType: "application/json; charset=utf-8",
       dataType: "json",
       success: successHandler,
       error: errorHandler
    });  

到我的 Rails 控制器:

def authorisation_request
    puts "preparse" 
    hash = JSON.parse(params[:username])
    puts "hash" 
    puts "username:" + JSON.parse(params[:username]).to_s + " type:" +  JSON.parse(params[:type]).to_s + " data:" + JSON.parse(params[:data]).to_s
end

我在控制台中收到以下错误:

 Parameters: {"username"=>"me@example.com", "type"=>"payment", "data"=>{"cardholdername"=>"me myself", "cardnumber"=>"xxxxxxxxxxxx3456", "expmonth"=>"01", "expyear"=>"2015", "cvv"=>"999", "
amount"=>"$15.00"}, "session"=>{"username"=>"me@example.com", "type"=>"payment", "data"=>{"car
dholdername"=>"me myself", "cardnumber"=>"xxxxxxxxxxxx3456", "expmonth"=>"01", "expyear"=>"2015"
, "cvv"=>"999", "amount"=>"$15.00"}}}

preparse
Completed 500 Internal Server Error in 4ms

JSON::ParserError (757: unexpected token at 'me@example.com'):
  app/controllers/sessions_controller.rb:119:in `authorisation_request'

我做错了什么?

【问题讨论】:

    标签: jquery ruby-on-rails ruby json


    【解决方案1】:

    params[:username] 包含不是有效 JSON 的字符串 (me@example.com)。您无需为此致电JSON.parse

    【讨论】:

      【解决方案2】:

      如果你像这样从你的 jQuery 发布数据,对你来说会更干净、更容易:

      var postData = new Object();
      postData.userdata = { 'username': username, 
                            'type': authorisationType,
                            'data': paymentData };
      

      现在,在控制器中,您可以:

      def authorisation_request
        puts params[:userdata]
      end
      

      不需要JSON.parse,因为参数中的所有值都可以使用params作为键值对。

      【讨论】:

      • +1 因为虽然它不直接回答问题,但它提供了关于最佳实践的很好的建议并使问题无关紧要。现在可以像这样访问参数:params[:userdata][:username],等等。谢谢!
      猜你喜欢
      • 2018-02-11
      • 2011-07-05
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多