【问题标题】:SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON dataSyntaxError:JSON.parse:JSON 数据的第 1 行第 1 列出现意外字符
【发布时间】:2014-11-02 20:06:17
【问题描述】:

我花了 6 个多小时在我的代码中查找异常或特殊字符,但我找不到。我在这里检查了所有类似的消息。

我正在发送带有精美弹出窗口的表单。首先,我使用内联弹出窗口打开我的表单,而不是将所有输入发送到 main.js 进行验证。

所以,我只需要第三只眼。

我有:index.htmlregister.phpmain.js

这是代码

FORM

JS/AJAX

PHP-register.php

这里是错误信息

JSON 输出

Chrome 控制台:

Firefox 控制台:


我错过了什么?

【问题讨论】:

  • 开头真的有Object吗?
  • @DanielA.White 在 js 页面中?请给点提示好吗?
  • 你为什么不用$(this).serialize()来发布你的数据?
  • @Teemu 这就是我来这里问的原因。我有点新。你能给我看一个小例子吗?我不想让你写完整的代码。
  • 哈哈哈别对我大喊大叫,我只是一个28岁的小男孩!快30了! :) 现在它变成: JSON.stringify(postData) .. 所以我的输出已更改为 '{"objAskGrant":"Yes","objPass":"asdfasdf","objNameSurname":"asdfasdf adfasdf","objEmail":"asdfaf@asdfaf.com","objGsm":3241234123,"objAdres":"asdfasdf","objTerms":"CheckIsValid"}'... 现在我遇到 TypeError: data is null(需要再来一杯啤酒!求您的帮助!)

标签: javascript php jquery ajax json


【解决方案1】:

为了寻求解决类似问题的搜索者的利益,如果您的输入为空字符串,您可能会收到类似的错误。

例如

var d = "";
var json = JSON.parse(d);

或者如果你正在使用 AngularJS

var d = "";
var json = angular.fromJson(d);

在 chrome 中,它导致“未捕获的语法错误:输入意外结束”,但 Firebug 将其显示为“JSON.parse:JSON 数据的第 1 行第 1 列的数据意外结束”。

当然大多数人不会被这个发现,但我没有保护该方法,它导致了这个错误。

【讨论】:

    【解决方案2】:

    字符是

    由于我没有你的数据库,我正在检查你的代码试图找到错误,到目前为止,我已经更新了你的 JS 文件

    $("#register-form").submit(function (event) {
    
        var entrance = $(this).find('input[name="IsValid"]').val();
        var password = $(this).find('input[name="objPassword"]').val();
        var namesurname = $(this).find('input[name="objNameSurname"]').val();
        var email = $(this).find('input[name="objEmail"]').val();
        var gsm = $(this).find('input[name="objGsm"]').val();
        var adres = $(this).find('input[name="objAddress"]').val();
        var termsOk = $(this).find('input[name="objAcceptTerms"]').val();
    
        var formURL = $(this).attr("action");
    
    
        if (request) {
            request.abort(); // cancel if any process on pending
        }
    
        var postData = {
            "objAskGrant": entrance,
            "objPass": password,
            "objNameSurname": namesurname,
            "objEmail": email,
            "objGsm": parseInt(gsm),
            "objAdres": adres,
            "objTerms": termsOk
        };
    
        $.post(formURL,postData,function(data,status){
            console.log("Data: " + data + "\nStatus: " + status);
        });
    
        event.preventDefault();
    });
    

    PHP 编辑:

     if (isset($_POST)) {
    
        $fValid = clear($_POST['objAskGrant']);
        $fTerms = clear($_POST['objTerms']);
    
        if ($fValid) {
            $fPass = clear($_POST['objPass']);
            $fNameSurname = clear($_POST['objNameSurname']);
            $fMail = clear($_POST['objEmail']);
            $fGsm = clear(int($_POST['objGsm']));
            $fAddress = clear($_POST['objAdres']);
            $UserIpAddress = "hidden";
            $UserCityLocation = "hidden";
            $UserCountry = "hidden";
    
            $DateTime = new DateTime();
            $result = $date->format('d-m-Y-H:i:s');
            $krr = explode('-', $result);
            $resultDateTime = implode("", $krr);
    
            $data = array('error' => 'Yükleme Sırasında Hata Oluştu');
    
            $kayit = "INSERT INTO tbl_Records(UserNameSurname, UserMail, UserGsm, UserAddress, DateAdded, UserIp, UserCityLocation, UserCountry, IsChecked, GivenPasscode) VALUES ('$fNameSurname', '$fMail', '$fGsm', '$fAddress', '$resultDateTime', '$UserIpAddress', '$UserCityLocation', '$UserCountry', '$fTerms', '$fPass')";
            $retval = mysql_query( $kayit, $conn ); // Update with you connection details
                if ($retval) {
                    $data = array('success' => 'Register Completed', 'postData' => $_POST);
                }
    
            } // valid ends
        }echo json_encode($data);
    

    【讨论】:

    • 让我检查一下。这也是我的数据库:link
    • 你在哪里改的?它就像旧的一样。我试过也不起作用。
    • 这是 html 标记在第二行 - 如果它与开头的 " 或 ' 不在同一行,这可能会导致问题
    • 我试过了。您将我的“gsm”从 varchar 更改为 int,我将其更改为 intval() 但没有任何反应。仍然缺少一些东西。它给出:TypeError: data is null
    • offtopic : link 这首歌献给你!谢谢男人
    【解决方案3】:

    删除

     dataType: 'json'
    

    替换为

     dataType: 'text'
    

    【讨论】:

      【解决方案4】:

      我有完全相同的问题,我发现了一些东西。 我已经评论了这一行:

      数据类型:'json',

      之后它成功了,但是...当我执行 console.log(data) 时,它返回了主 index.html。

      这就是为什么你有“Unexpected token

      【讨论】:

        【解决方案5】:

        将数据类型更改为文本有帮助 数据类型:'文本'

        我检查了 JSONlint,我的 json 格式是正确的。当我设置 dataType: 'json'

        时仍然抛出错误
        JSON Data: {"eventinvite":1,"groupcount":8,"totalMessagesUnread":0,"unreadmessages":{"378":0,"379":0,"380":0,"385":0,"390":0,"393":0,"413":0,"418":0}} 
        

        【讨论】:

        • 嘿,这真的很有帮助,我在过去的 48 小时里一直在思考,它帮助了我,你能解释一下为什么它会这样吗?谢谢你。并为提示 +1。
        【解决方案6】:

        您确定您没有在url 字段中使用错误的路径吗? - 我遇到了同样的错误,检查路径后问题解决了,发现错误并用正确的替换它。

        确保您指定的 URL 对 AJAX 请求正确且文件存在。

        【讨论】:

        • 是的,我的网址错误。谢谢。
        【解决方案7】:

        在 AJAX 调用中使用 NodeJS 发送 JSON 数据:

        $.ajax({
            url: '/listClientsNames',
            type: 'POST',
            dataType: 'json',
            data: JSON.stringify({foo:'bar'})
        }).done(function(response){
            console.log("response :: "+response[0].nom);
        });
        

        注意删除空格。

        app.post("/listClientsNames", function(req,res){
        
                var querySQL = "SELECT id, nom FROM clients";   
                var data = new Array();
        
                var execQuery = connection.query(querySQL, function(err, rows, fields){
        
                    if(!err){
                        for(var i=0; i<25; i++){
                            data.push({"nom":rows[i].nom});         
                        }
                        res.contentType('application/json');
                        res.json(data); 
                    }else{  
                        console.log("[SQL005] - Une erreur est survenue");
                    }
        
                });
        
        });
        

        【讨论】:

          【解决方案8】:

          即使您的 JSON 没问题,也可能是 DB 字符集 (UTF8) 问题。如果您的数据库的字符集/排序规则是 UTF8,但未正确设置 PDO(缺少字符集/解决方法),则数据库中的某些 à / è / ò / ì / 等可能会破坏您的 JSON 编码(仍然编码但会导致解析问题)。检查您的连接字符串,它应该类似于以下之一:

          $pdo = new PDO('mysql:host=hostname;dbname=DBname;**charset=utf8**','username','password'); // PHP >= 5.3.6
          
          $pdo = new PDO('mysql:host=hostname;dbname=DBname','username','password',**array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")**); // older versions
          

          附:已经过时,但对于那些被“意外角色”卡住的人仍然可能会有所帮助。

          【讨论】:

            【解决方案9】:

            从 json 文件see attached link 获取数据时遇到同样的错误

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

            所以,我检查了不正确的json文件的路径,

            const search = document.getElementById("search");
            const matchList = document.getElementById("match-list");
            
            //search json data and filter
            const searchStates = async searchText => {
                const res = await fetch('../state.json');
                const states = await res.json();
                console.log(states);
            }
            
            search.addEventListener('input', () => searchStates(search.value));
            

            所以我改变了文件的路径

            const res = await fetch('./state.json');
            

            & 结果它给了我数组。 所以,检查你的路径并尝试改变它。它适用于我的情况。我希望这是有效的..

            【讨论】:

              【解决方案10】:

              JSON.parse() 无法将该数据识别为字符串。例如{objAskGrant:"Yes",objPass:"asdfasdf",objNameSurname:"asdfasdf adfasdf",objEmail:"asdfaf@asdfaf.com",objGsm:3241234123,objAdres:"asdfasdf",objTerms:"CheckIsValid"}

              就像这样:JSON.parse({objAskGrant:"Yes",objPass:"asdfasdf",objNameSurname:"asdfasdf adfasdf",objEmail:"asdfaf@asdfaf.com",objGsm:3241234123,objAdres:"asdfasdf",objTerms:"CheckIsValid"}); 那将输出 SyntaxError: missing " ' " 而不是 "{" on line...

              这样正确地包装所有数据:'{"objAskGrant":"Yes","objPass":"asdfasdf","objNameSurname":"asdfasdf adfasdf","objEmail":"asdfaf@asdfaf.com","objGsm":3241234123,"objAdres":"asdfasdf","objTerms":"CheckIsValid"}' 这对我来说非常好。

              而不是这样:"{"objAskGrant":"Yes","objPass":"asdfasdf","objNameSurname":"asdfasdf adfasdf","objEmail":"asdfaf@asdfaf.com","objGsm":3241234123,"objAdres":"asdfasdf","objTerms":"CheckIsValid"}" 这给出了您遇到的当前错误。

              【讨论】:

                【解决方案11】:

                可能是它不相关的答案,但它在我的情况下工作......不知道我的服务器出了什么问题......我只是在 Ubuntu 16.04 服务器上启用错误日志。

                //For PHP
                error_reporting(E_ALL);
                ini_set('display_errors', 1);
                

                【讨论】:

                  【解决方案12】:

                  当结果是成功但你得到“

                  如果您想查看所有消息,您可以通过以下方式获得成功响应的结果:

                  success: function(response){
                       var out = "";
                       for(var i = 0; i < response.length; i++) {
                          out += response[i];
                       }
                       alert(out) ;
                  },
                  

                  【讨论】:

                    【解决方案13】:

                    在某些情况下,数据未编码为 JSON 格式,因此您需要先对其进行编码,例如

                     json_encode($data);
                    

                    稍后你将在你的 JS 中使用 json Parse,比如

                    JSON.parse(data);
                    

                    【讨论】:

                      【解决方案14】:

                      尝试使用 MYSQLI_ASSOC 代替 MYSQL_ASSOC...通常问题会得到解决,改变它

                      祝你好运!

                      【讨论】:

                        【解决方案15】:

                        我在带有分页功能的应用程序中的 AJAX 调用中遇到了同样的错误,或者在任何情况下都使用 URL 中的查询字符串

                        因为 AJAX 发布到类似的东西

                        var url = window.location.href + 'search.php';
                        ...
                        ...
                        fetch(url, {
                                method: 'POST', 
                                headers: {
                                  'Content-Type': 'application/json',
                                },
                                body: JSON.stringify({search: text}),
                              })
                        

                        只要在浏览器 URL 中添加了一些查询字符串,就会弹出错误“JSON.parse:第 1 行第 1 列的意外字符”

                        解决方案是简单地从任何查询字符串中清除 URL

                        var url = window.location.href.split('?')[0] + 'search.php';
                        

                        问题得到解决

                        所以,错误不是 Json 的格式,而是 POST 的错误 URL

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2023-03-11
                          • 1970-01-01
                          • 1970-01-01
                          • 2021-04-02
                          • 1970-01-01
                          • 2016-11-19
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多