解码JSON.stringify-ed Array后出现JSON.parse错误

时间:2017-07-24 11:43:57

标签: php json form-data

我想通过JSON提交一个数组数组。所以我创建了一个对象,在其上应用JSON.stringify()并将其设置为formData ...

    var sources = new Array();
    $('.source-instance').each(function(){

        var auxObject = {};
        auxObject["sourceTitle"] = $(this).find(".source-title").val();   

        sources.push(auxObject);
        console.log('sources: ' + JSON.stringify(sources));
    });

    formData.set('sources', JSON.stringify(sources));

检查数据时

console.log(formData.get('sources'))

我得到了

[{"sourceTitle":"SomeTitle"},{"sourceTitle":"AnotherTitle"}]

...然后我通过AJAX进入服务器。

在php的服务器端,我遍历数组并让它打印出来:

foreach (json_decode($request['sources'], true) as $sourceInstance) {
    print_r($sourceInstance);
}

我得到了

Array
(
    [sourceTitle] => SomeTitle
)
Array
(
    [sourceTitle] => AnotherTitle
)

看起来很不错。但我也得到了

SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

怎么回事?我怎么修这个呢?我不知道它来自哪里。

修改 ajax看起来像这样:

    $.ajax({
        url: '/piece/store',
        type: 'POST',
        processData: false,
        contentType: false,
        dataType: 'JSON',     
        data: formData,
        success: function(response){
           if (response.status == 'error'){
              // show the erors
           }
           if (response.status == 'success'){ // "redirect" to success page
               window.location.replace('/succes');
           }
        },
        error: function(response){
           $(".optional.errors").show();
           $('ul.errors').empty();
           $.each(response.errors, function (index, error) {
               $('ul.errors').append('<li>' + error + '</li>');
           });    
       }
    });

php回复:

$response = [
    'status' => 'success',
];                     
return response()->json($response);

1 个答案:

答案 0 :(得分:1)

当jQuery尝试解析来自ajax调用的响应时,会发生该错误消息。

在你的ajax请求中,你设置了:dataType: 'json',它告诉jQuery期望响应是一个json字符串。然后jQuery将尝试将json-string解析为json-object(使用JSON.parse())。

但是,由于PHP代码中包含print_r($sourceInstance),因此响应不会成为有效的json字符串,并会导致JSON.parse()失败。

服务器端的任何输出(echo,var_dump,print_r等)都将成为响应的一部分。