【问题标题】:malformed JSON string Error while passing JSON from AngularJS从AngularJS传递JSON时格式错误的JSON字符串错误
【发布时间】:2015-09-14 22:47:08
【问题描述】:

我正在尝试在 ajax 请求中传递 JSON 字符串。这是我的代码。

    NewOrder =  JSON.stringify (NewOrder);
    alert (NewOrder);

    var req = {
        url: '/cgi-bin/PlaceOrder.pl',
        method: 'POST',
        headers: { 'Content-Type': 'application/json'},
        data: "mydata="+ NewOrder
    };  

    $http(req)
    .success(function (data, status, headers, config) {
        alert ('success');
    })
    .error(function (data, status, headers, config) {
        alert (status);
        alert (data);
        alert ('Error')
    });

alert (NewOrder) 给出 -

{"ItemList":[{"ItemName":"Quality Plus Pure Besan 500 GM","Quantity":1,"MRP":"28.00","SellPrice":"25.00"}],"CustomerID":1,"DeliverySlot":2,"PaymentMode":1}

这似乎是一个有效的 JSON 字符串。

但在脚本方面我收到以下错误。在这一行

my $decdata = decode_json($cgi->param('mydata'));

格式错误的 JSON 字符串,既不是数组、对象、数字、字符串也不是原子,在字符偏移量 0 处(在“(字符串结尾)”之前)

请有人帮助我为什么会出现此错误?

【问题讨论】:

  • 你能在你的服务器端显示$cgi->param('mydata')吗?

标签: javascript json angularjs perl


【解决方案1】:

$cgi->param('myData') 返回查询参数字符串“mydata”,在您的情况下未发送。

您将 json 数据发布在您的 http post 有效负载的请求正文中,而不是作为查询/表单参数。在这种情况下,您需要一些其他函数来读取服务器端脚本中请求正文的内容。

恰好是: my $data = $query->param('POSTDATA');

如此处所述:http://search.cpan.org/~lds/CGI.pm-3.43/CGI.pm#HANDLING_NON-URLENCODED_ARGUMENTS

您还应该从您发布的正文中的 json 中删除“mydata=”,因为 http 请求有效负载正文没有参数名称(它们仅用于查询/表单参数)。

你的结束代码应该是这样的:

var req = {
    url: '/cgi-bin/PlaceOrder.pl',
    method: 'POST',
    headers: { 'Content-Type': 'application/json'},
    data: NewOrder
}; 

和服务器端:

my $decdata = decode_json($query->param('POSTDATA'));

【讨论】:

  • 谢谢neuro_sys。它就像一个魅力。从几天开始,我一直在这方面苦苦挣扎。您的解决方案非常完美。再次感谢
【解决方案2】:

我觉得可能和这个问题有关:AngularJs $http.post() does not send data

通常我会发布这样的数据:

var req = {
    url: '/cgi-bin/PlaceOrder.pl',
    method: 'POST',
    headers: { 'Content-Type': 'application/json'},
    data: {"mydata" : NewOrder}
};  

但是我假设您期望数据作为请求参数:

my $decdata = decode_json($cgi->param('mydata'));

如果是这种情况,那么链接的 SO 问题就是您要查找的内容。

【讨论】:

  • 我根据您的建议更改了代码。但仍然是同样的问题。 :(
【解决方案3】:

Angular $http.post 接受两个参数作为 url 和 payload

   var url = '/cgi-bin/PlaceOrder.pl';
   var payLoad = {'myData' :JSON.stringify(NewOrder)}; 

    $http.post(url, payLoad)
    .success(function(data) {
    console.log(success);
    })

在服务器端,从请求参数中获取所需的json字符串,然后对json进行反序列化,如下所示:

    $result = $cgi->param('myData');
    my $decdata = decode_json($result);

【讨论】:

  • 嗨开发者一。我试过你的建议。但我仍然遇到同样的错误。
  • 你能分享一下你如何处理json对象的请求的服务器端函数,即$cgi-> param('myData')
  • 我是这样处理的:我的 $decdata = decode_json($cgi->param('myData'));
  • 请注意我使用的是 Perl(不是 php),这就是为什么使用函数 decode_json(不是 json_decode)
猜你喜欢
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 2021-06-30
  • 2016-03-16
相关资源
最近更新 更多