簡體   English   中英

SyntaxError: JSON.parse: JSON 數據的第 1 行第 1 列的數據意外結束

[英]SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data

好的,所以我正在嘗試從一個包含幾個 LED 等狀態的 json 文件中提取數據。我有一個每秒運行幾次的腳本,它會提取數據並讓網頁加載它。 問題是,服務器讀取 json 文件大約 20 次后,最終會拋出這個錯誤。

SyntaxError: JSON.parse: JSON 數據的第 1 行第 1 列的數據意外結束

// For toggling the LED/switch status indicators using the json data
$(document).ready(function() {
    (function worker() {
        $.ajax({
            url: 'server_info.json',
            success: function(data) {
                var json = $.parseJSON(data);
                console.log(json); 
                if (json.led_1 == "off") {
                    // do stuff
                }        
                if (json.led_2 == "off") {
                    // do stuff
                } 
                if (json.led_3 == "off") {
                    // do stuff
                }        
            },
            complete: function() {
                // Schedule the next request when the current one's complete
                setTimeout(worker, 250);
            }
        });
    })();
});

json 文件如下所示:

{ "led_1": "on", "led_2": "on", "led_3": "on" } 

在我看來,json 數據的格式總是正確的。 我不明白錯誤來自哪里。 有任何想法嗎?

使用 Firefox 調試,當我收到該錯誤時,我能夠看到返回的值類型是未定義的。 首先檢查要解析的值是否為空/未定義,然后如果條件為假,則繼續解析,否則處理條件解決了我的問題。

使用“dataType”設置來識別響應的類型,這樣 .ajax() 調用就知道它的 JSON 並且不需要猜測。

這可能無法解決問題,因為您的響應可能沒有為引發錯誤的調用返回 JSON。 如果添加錯誤設置,您可以看到服務器在錯誤時返回的內容,但如果請求完成,請檢查控制台以了解從服務器返回的內容。 正如我所說,如果您從 $.parseJSON() 開始收到該錯誤,它可能不是 JSON。

$(document).ready(function() {
    (function worker() {
        $.ajax({
            url: 'server_info.json',
            dataType: 'json',
            success: function(data) {
                console.log(data); 
                if (data.led_1 == "off") {
                    // do stuff
                }        
                if (data.led_2 == "off") {
                    // do stuff
                } 
                if (data.led_3 == "off") {
                    // do stuff
                }        
            },
            error: function( data, status, error ) { 
                console.log(data);
                console.log(status);
                console.log(error);
            },
            complete: function() {
                // Schedule the next request when the current one's complete
                setTimeout(worker, 250);
            }
        });
    })();
});

事實證明,該錯誤與 JSON 無關。 這實際上是因為后端返回非 JSON 或空字符串。

// Update
    if(updateFile($id,$author)) {
      echo json_encode(
        array('message' => 'Post Updated')
      );
    } else {
      echo json_encode(
        array('message' => 'Post Not Updated')
      );
    }

至於我,這行得通。 祝你好運

出現此錯誤的原因列表

肯定有更多的理由:

未捕獲的 SyntaxError:JSON.parse:JSON 數據的第 1 行第 1 列的數據意外結束

即使原因最終可能沒有您的用例,該列表也應該為出現此錯誤的人提供一些提示。

空響應,因為所有參數都未定義

接受使用 FireFox 調試的贊成答案,這里有一個如何使用調試器的示例( Ctrl+Shift+CF12 --> 調試器)。 我有相同的錯誤消息,但代碼不同。

  1. 您需要檢查復選框“暫停異常”(我還檢查了“暫停捕獲異常”,我不知道是否需要)和

  2. 觸發您要測試的內容。

在此處輸入圖像描述

  1. 錯誤

SyntaxError: JSON.parse: JSON 數據的第 1 行第 1 列的數據意外結束

當代碼到達時拋出

if (JSON.parse(resp) > 0){
  1. 事實證明,在我的情況下, resp是一個空字符串(因為它是空的,所以無法解析)。

在此處輸入圖像描述

  1. 找到錯誤行后,您可以取消選中“異常暫停”復選框,然后按“恢復”以結束代碼運行。

在此處輸入圖像描述

  1. 在上面的行前面添加:

     if (resp != ""){...

似乎可以修復它,它運行沒有錯誤,但這不是解決方案,因為它只是跳過了這一步,但更新將不再完成。 我改回沒有if (resp != ""){的代碼。

  1. 檢查后端(php)和前端(js)

您可以使用echo($sql); 在網絡選項卡的響應中打印 SQL:

在此處輸入圖像描述

ajax 后端顯示了響應為空的原因:傳遞了一個空值,導致類似 SQL

update my_table set where x = 123

雖然應該是

update my_table set my_var = 1 where x = 123

我通過更改 javascript (js) 中的變量解決了這個問題

var my_var1 = row["my_var1"];

var my_var1 = row["my_var1"] ?? '';

並在 php

$raw_my_var1 = $_REQUEST['my_var1'] ;
$my_var1 = $raw_my_var1 != NULL ? $raw_my_var1 : '' ;

或在一行中:

$my_var1 = isset($_REQUEST['my_var1']) ? $_REQUEST['my_var1'] : '';

使空值成為空字符串。

此外,您還應該檢查(!):

empty($my_var1)

因為一個空變量(如果你想寫一個空字符串""到 SQL 中的一個字段)仍然有isset($my_var1) = 1!

這些檢查很可能是撰寫本文時得票最多的答案的意思。

這只是解決方案的一步。 它有助於通過一個循環步驟,其中前端的某些字段未填充。

沒有權限

您在問題中沒有使用 SQL,這只是為了提醒大家權限。

當您在后端使用 SQL 並且您的用戶沒有讀/寫權限/權限來選擇、插入、更新、刪除或在 sql 后端的代碼中使用的任何內容時,您會收到相關錯誤也是。

如果要更新,這還不夠:

在此處輸入圖像描述

更新將不起作用,並且響應可能變為空。 看看你的后端代碼。

SQL 中需要沒有字符串引號的數據類型“十進制”

當數據類型變為 SQL 中的數值字符串時,也可能會引發有問題的錯誤,盡管所需的值是數值。

在此處輸入圖像描述

這至少是我一開始的想法,事實證明 SQL 可以將'1'讀取為整數1而它不能將'1.00'讀取為十進制1.00 這就是為什么它只在前端字段中用1覆蓋1.00時起作用。

真正的原因在於后端的 SQL。

為了將傳遞的值保留為小數或整數,我只是刪除了后端 SQL 代碼中(錯誤地)添加的引號。

           $sql = $sql . "my_var_numeric='" . $value_numeric . "'";

           $sql = $sql . "my_var_numeric=" . $value_numeric ;

這樣后端的字段數據類型decimal(12,2)就被傳遞了。

在此處輸入圖像描述

在我的測試中,我沒有更改這個1.00字段,而只更改了兩個文本字段,因此令人驚訝的是,另一個我從未更改過的字段會成為問題。

后端響應中忘記調試回顯

為了調試,我在 ajax php 后端添加了一些echo($sql) ,它們是在 sql 查詢的預期 echo($result) = 1 之前添加的。

再次評論 echo 命令也刪除了有問題的錯誤。

在另一種情況下,計划外的回聲也將錯誤消息稍微更改為

未捕獲的語法錯誤:JSON.parse:JSON 數據的第 1 行第 3 列的數據意外結束

(第 3 列而不是第 1 列)

后端變量名錯誤

我還檢查了一個變量是否為空,盡管該變量不存在,但在我的情況下它有一個不需要的前綴,例如:

if ($not_existing_prefix_var1 != '' || $var2){
[... run sql]

這也引發了有問題的錯誤。

我只需要將代碼更改為

if ($var1 != '' || $var2){
[... run sql]

在 NOT NULL 字段中插入 NULL

我得到了錯誤

未捕獲的語法錯誤:JSON.parse:JSON 數據的第 1 行第 3 列的數據意外結束

(現在是第 3 列而不是第 1 列)

當我嘗試在不允許使用 NULL 時使用 NULL 值更新 SQL 中的字段時。

這是什么一回事呢

在您的情況下,可能是在后端文件中,僅在少數情況下,“on”和“off”字段是一個整數,拼寫錯誤,如“offf”,其中包含禁止的特殊字符,或者更有可能的是,為空/未填充/未定義。 具有其他未定義值或格式不正確的項目。 或者數據中有一個十進制數據類型,其中一個整數在源中。 等等。 或者你有尾隨逗號或前導零。 SyntaxError: JSON.parse: bad parsing中存在大量此類數據類型錯誤。 該鏈接是您的錯誤的官方幫助,顯示在瀏覽器的調試器中。

后端文件中的某些項目也可能存在錯誤的語法,如果您僅在讀取工作時返回響應,則可能會返回空響​​應。 但這取決於您的代碼,因為 json 中的語法錯誤會使文件不可讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM