簡體   English   中英

"未捕獲的 SyntaxError:帶有 JSON.parse 的意外標記"

[英]Uncaught SyntaxError: Unexpected token with JSON.parse

是什么導致第三行出現此錯誤?

打開控制台查看錯誤<\/sup>

products<\/code>是一個對象。 (從對象字面量創建)

JSON.parse()<\/code>用於將包含 JSON 表示法的字符串<\/strong>轉換為 Javascript 對象。

您的代碼將對象轉換為字符串(通過調用.toString()<\/code> ),以便嘗試將其解析為 JSON 文本。
默認的.toString()<\/code>返回"[object Object]"<\/code> ,這是無效的 JSON; 因此錯誤。

假設你知道它是有效的 JSON,但你仍然得到這個......

在這種情況下,字符串中可能有隱藏\/特殊字符來自您獲取它們的任何來源。 當您粘貼到驗證器中時,它們會丟失 - 但在字符串中它們仍然存在。 這些字符雖然不可見,但會破壞JSON.parse()<\/code>

如果s<\/code>是您的原始 JSON,則使用以下命令對其進行清理:

// preserve newlines, etc - use valid JSON
s = s.replace(/\\n/g, "\\n")  
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
// remove non-printable and other non-valid JSON chars
s = s.replace(/[\u0000-\u0019]+/g,""); 
var o = JSON.parse(s);

似乎您想對對象進行字符串化<\/strong>,而不是解析。 所以這樣做:

JSON.stringify(products);

我發現與JSON.parse(inputString)<\/code>相同的問題。

在我的情況下,輸入字符串來自我的服務器頁面[return of a page method]<\/em> 。

我打印了typeof(inputString)<\/code> - 它是字符串,仍然發生錯誤。

我也試過JSON.stringify(inputString)<\/code> ,但沒有幫助。

后來我發現這是字段值內的換行符[\\n]<\/code>的問題。

我做了一個替換[用其他字符,在解析后放回新行]<\/em> ,一切正常。

JSON.parse 正在等待參數中的字符串。 您需要對 JSON 對象進行字符串化以解決問題。

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];
console.log(products);
var b = JSON.parse(JSON.stringify(products));  //solves the problem

您應該在此處<\/a>驗證您的 JSON 字符串。

有效的 JSON 字符串的鍵必須有雙引號:

JSON.parse({"u1":1000,"u2":1100})       // will be ok
products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];

如果有前導或尾隨空格,則無效。 尾隨\/前導空格可以刪除為

mystring = mystring.replace(/^\s+|\s+$/g, "");

這是我根據以前的回復制作的一個功能:它可以在我的機器上運行,但是 YMMV。

          /**
             * @description Converts a string response to an array of objects.
             * @param {string} string - The string you want to convert.
             * @returns {array} - an array of objects.
            */
            function stringToJson(input) {
              var result = [];

              //replace leading and trailing [], if present
              input = input.replace(/^\[/,'');
              input = input.replace(/\]$/,'');

              //change the delimiter to 
              input = input.replace(/},{/g,'};;;{');

              // preserve newlines, etc - use valid JSON
              //https://stackoverflow.com/questions/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
            input = input.replace(/\\n/g, "\\n")  
            .replace(/\\'/g, "\\'")
            .replace(/\\"/g, '\\"')
            .replace(/\\&/g, "\\&")
            .replace(/\\r/g, "\\r")
            .replace(/\\t/g, "\\t")
            .replace(/\\b/g, "\\b")
            .replace(/\\f/g, "\\f");
            // remove non-printable and other non-valid JSON chars
            input = input.replace(/[\u0000-\u0019]+/g,""); 

              input = input.split(';;;');

              input.forEach(function(element) {
                // console.log(JSON.stringify(element));

                result.push(JSON.parse(element));
              }, this);

              return result;
            }

調用JSON.parse()<\/code>時可能導致"SyntaxError: Unexpected token"<\/code>異常的另一個問題是在字符串值中使用以下任何內容:

  1. 換行符。

  2. 選項卡(是的,您可以使用 Tab 鍵生成的選項卡!)

  3. 任何獨立的斜線\\<\/code> (但由於某種原因不是\/<\/code> ,至少不是在 Chrome 上。)

    (有關完整列表,請參見此處的字符串部分<\/a>。)

    例如,以下內容將為您提供此異常:

    所以應該改為:

    我應該說,這使得它在帶有大量文本的純 JSON 格式中非常不可讀。

    "

[
  {
    "name": "Pizza",
    "price": "10",
    "quantity": "7"
  },
  {
    "name": "Cerveja",
    "price": "12",
    "quantity": "5"
  },
  {
    "name": "Hamburguer",
    "price": "10",
    "quantity": "2"
  },
  {
    "name": "Fraldas",
    "price": "6",
    "quantity": "2"
  }
]

希望這對其他人有幫助。

我的問題是我通過 AJAX 在 PHP 回調函數中對 HTML 進行了注釋,該函數正在解析注釋並返回無效的 JSON。

一旦我刪除了注釋的 HTML,一切都很好,JSON 被解析沒有問題。

當您使用 POST 或 PUT 方法時,請確保對正文部分進行字符串化。

我在這里記錄了一個示例https:\/\/gist.github.com\/manju16832003\/4a92a2be693a8fda7ca84b58b8fa7154<\/a>

您正在做的唯一錯誤是,您正在解析已經解析的對象,所以它會拋出錯誤,使用它,您會很高興。

如果要打印整個 json,請使用 JSON.stringify()

products 是一個可以直接使用的數組:

var i, j;

for(i=0;i<products.length;i++)
  for(j in products[i])
    console.log("property name: " + j,"value: "+products[i][j]);

現在顯然\\r<\/code> , \\b<\/code> , \\t<\/code> , \\f<\/code>等不是唯一可以給你這個錯誤的有問題的字符。

請注意,某些瀏覽器可能對JSON.parse<\/code>的輸入有額外<\/em>的要求。

在瀏覽器上運行此測試代碼:

var arr = [];
for(var x=0; x < 0xffff; ++x){
    try{
        JSON.parse(String.fromCharCode(0x22, x, 0x22));
    }catch(e){
        arr.push(x);
    }
}
console.log(arr);

哦,伙計,到目前為止提供的所有上述答案中的解決方案都對我不起作用。 我剛才也有類似的問題。 我設法用引號來解決它。 請參閱屏幕截圖。 哇。

原來的:<\/strong>

您得到的錯誤,即“意外的令牌 o”是因為 json 是預期的,但在解析時獲取了對象。 那個“o”是單詞“object”的第一個字母。

"

發生這種情況的原因有很多,但可能是因為字符無效,因此您可以使用JSON.stringify(obj);<\/code> 這會將您的對象轉換為 JSON,但請記住它是 JQUERY 表達式。

"

我有這個錯誤,因為返回json對象的API給出了一個錯誤(在我的情況下Code Igniter,當php代碼失敗時返回一個html)所以它不是JSON OBJECT。

檢查SQL Sentences和PHP代碼,並使用Postman(或其他一些API測試人員)進行測試

在我的情況下,我的JSON<\/code>字符串中存在以下字符問題

  1. \\r<\/li>
  2. \\t<\/li>
  3. \\r\\n<\/li>
  4. \\n<\/li>
  5. <\/li>
  6. "<\/li><\/ol>

    我已將它們替換為其他字符或符號,然后再次從編碼中恢復。

    "

現在這是一個 JavaScript 對象數組,而不是 JSON 格式。 要將其轉換為 JSON 格式,您需要使用名為JSON.stringify()<\/strong>的函數

JSON.stringify(products)

為什么需要 JSON.parse? 它已經在對象格式的數組中。

更好地使用 JSON.stringify 如下: var b = JSON.stringify(products);<\/code>

這可能會對您有所幫助。

我正在做的錯誤是將null<\/code> (在不知不覺中)傳遞給 JSON.parse()。

所以它Unexpected token n in JSON at position 0<\/code>

但是,每當您在 JSON.parse() 中傳遞不是 JS 對象的東西時,就會發生這種情況

是什么導致第三行出現此錯誤?

 var products = [{ "name": "Pizza", "price": "10", "quantity": "7" }, { "name": "Cerveja", "price": "12", "quantity": "5" }, { "name": "Hamburguer", "price": "10", "quantity": "2" }, { "name": "Fraldas", "price": "6", "quantity": "2" }]; console.log(products); var b = JSON.parse(products); //unexpected token o

打開控制台以查看錯誤

是什么導致第三行出現此錯誤?

 var products = [{ "name": "Pizza", "price": "10", "quantity": "7" }, { "name": "Cerveja", "price": "12", "quantity": "5" }, { "name": "Hamburguer", "price": "10", "quantity": "2" }, { "name": "Fraldas", "price": "6", "quantity": "2" }]; console.log(products); var b = JSON.parse(products); //unexpected token o

打開控制台以查看錯誤

使用eval<\/code> 。 它將 JavaScript 表達式\/代碼作為字符串並評估\/執行它。

eval(inputString);

暫無
暫無

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

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