"SyntaxError: Несподіваний маркер <в JSON в позиції 0"


199

У компоненті програми React, який обробляє канали, схожі на Facebook, я стикаюся з помилкою:

Feed.js: 94 undefined "parsererror" "SyntaxError: Несподіваний маркер <у JSON у позиції 0

Я зіткнувся з подібною помилкою, яка виявилася помилковою помилкою в HTML у функції візуалізації, але це, мабуть, не так.

Більш заплутано, я повернув код до більш ранньої відомої версії, і я все ще отримую помилку.

Feed.js:

import React from 'react';

var ThreadForm = React.createClass({
  getInitialState: function () {
    return {author: '', 
            text: '', 
            included: '',
            victim: ''
            }
  },
  handleAuthorChange: function (e) {
    this.setState({author: e.target.value})
  },
  handleTextChange: function (e) {
    this.setState({text: e.target.value})
  },
  handleIncludedChange: function (e) {
    this.setState({included: e.target.value})
  },
  handleVictimChange: function (e) {
    this.setState({victim: e.target.value})
  },
  handleSubmit: function (e) {
    e.preventDefault()
    var author = this.state.author.trim()
    var text = this.state.text.trim()
    var included = this.state.included.trim()
    var victim = this.state.victim.trim()
    if (!text || !author || !included || !victim) {
      return
    }
    this.props.onThreadSubmit({author: author, 
                                text: text, 
                                included: included,
                                victim: victim
                              })
    this.setState({author: '', 
                  text: '', 
                  included: '',
                  victim: ''
                  })
  },
  render: function () {
    return (
    <form className="threadForm" onSubmit={this.handleSubmit}>
      <input
        type="text"
        placeholder="Your name"
        value={this.state.author}
        onChange={this.handleAuthorChange} />
      <input
        type="text"
        placeholder="Say something..."
        value={this.state.text}
        onChange={this.handleTextChange} />
      <input
        type="text"
        placeholder="Name your victim"
        value={this.state.victim}
        onChange={this.handleVictimChange} />
      <input
        type="text"
        placeholder="Who can see?"
        value={this.state.included}
        onChange={this.handleIncludedChange} />
      <input type="submit" value="Post" />
    </form>
    )
  }
})

var ThreadsBox = React.createClass({
  loadThreadsFromServer: function () {
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      cache: false,
      success: function (data) {
        this.setState({data: data})
      }.bind(this),
      error: function (xhr, status, err) {
        console.error(this.props.url, status, err.toString())
      }.bind(this)
    })
  },
  handleThreadSubmit: function (thread) {
    var threads = this.state.data
    var newThreads = threads.concat([thread])
    this.setState({data: newThreads})
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      type: 'POST',
      data: thread,
      success: function (data) {
        this.setState({data: data})
      }.bind(this),
      error: function (xhr, status, err) {
        this.setState({data: threads})
        console.error(this.props.url, status, err.toString())
      }.bind(this)
    })
  },
  getInitialState: function () {
    return {data: []}
  },
  componentDidMount: function () {
    this.loadThreadsFromServer()
    setInterval(this.loadThreadsFromServer, this.props.pollInterval)
  },
  render: function () {
    return (
    <div className="threadsBox">
      <h1>Feed</h1>
      <div>
        <ThreadForm onThreadSubmit={this.handleThreadSubmit} />
      </div>
    </div>
    )
  }
})

module.exports = ThreadsBox

У інструментах для розробників Chrome, здається, виникає помилка від цієї функції:

 loadThreadsFromServer: function loadThreadsFromServer() {
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      cache: false,
      success: function (data) {
        this.setState({ data: data });
      }.bind(this),
      error: function (xhr, status, err) {
        console.error(this.props.url, status, err.toString());
      }.bind(this)
    });
  },

з console.error(this.props.url, status, err.toString()підкресленою лінією .

Оскільки, схоже, помилка має щось спільне із витягуванням даних JSON з сервера, я спробував почати з порожнього db, але помилка зберігається. Схоже, помилка викликається в нескінченному циклі, імовірно, оскільки React постійно намагається підключитися до сервера і врешті-решт збої браузера.

Редагувати:

Я перевірив відповідь сервера за допомогою інструментів для розробників Chrome та клієнта Chrome REST, і дані здаються належними JSON.

EDIT 2:

Здається, що хоч призначена кінцева точка API дійсно повертає правильні дані та формат JSON, React опитується http://localhost:3000/?_=1463499798727замість очікуваного http://localhost:3001/api/threads.

Я запускаю сервер гарячого перезавантаження веб-пакета на порт 3000 з експрес-додатком, що працює на порту 3001, щоб повернути дані заходу. Що тут засмучує, що це працювало правильно, коли я працював над ним останній раз, і не можу знайти те, що я міг би змінити, щоб зламати його.


11
Це говорить про те, що ваш "JSON" - це фактично HTML. Подивіться на дані, які ви отримуєте з сервера.
— Квентін

2
Це помилка, яку ви отримуєте, якщо ви робите щось на кшталт JSON.parse("<foo>")- рядок JSON (який ви очікуєте dataType: 'json') не може починатися <.
— апсилери

Як сказав @quantin, це може бути html, можливо, якась помилка, спробуйте ту саму URL-адресу з іншими клієнтами для відпочинку
— maurycy

як я вже згадував, я спробував це з порожнім db (який повертається просто []), і він все ще дає ту саму помилку
— Cameron Sima

Вам, швидше за все, потрібно проксі-запити API проксі, залежно від вашого NODE_ENV. Дивіться це: github.com/facebookincubator/create-react-app/blob/master/…
— Кевін

Відповіді:


148

Формулювання повідомлення про помилку відповідає тому, що ви отримуєте від Google Chrome під час запуску JSON.parse('<...'). Я знаю, ви сказали, що сервер встановлює налаштування Content-Type:application/json, але я вважаю, що орган відповідей насправді HTML.

Feed.js:94 undefined "parsererror" "SyntaxError: Unexpected token < in JSON at position 0"

з console.error(this.props.url, status, err.toString())підкресленою лінією .

Фактично errбуло кинуто всередині jQueryі передано вам як змінну err. Причина того, що рядок підкреслена, просто тому, що саме там ви реєструєте його.

Я б запропонував вам додати свій журнал. Переглядаючи фактичні xhrвластивості (XMLHttpRequest), щоб дізнатися більше про відповідь. Спробуйте додати, console.warn(xhr.responseText)і ви, швидше за все, побачите отриманий HTML.


3
Дякую, я зробив це, і ти маєш рацію - react запитує неправильну URL-адресу і повертає вміст index.html. Я просто не можу дізнатися, чому.
— Камерон Сіма

8
Дякуємо за додатковий оператор налагодження, хоча мені потрібно було користуватися console.warn(jqxhr.responseText). Це дуже допомогло в діагностиці моєї проблеми.
— користувач2441511

@ Mimi314159, console.log, console.warnі console.errorбуде все записи у вашій консолі. Однак консоль зазвичай надає параметри фільтра журналу, тому переконайтеся, що вони включені або вимкнено, як вам зручніше.
— Брайан Поле

1
У моєму випадку сталася помилка PHP, яка спричинила повернення сервера HTML, а не дійсного JSON.
— Дерек S

54

Ви отримуєте HTML (або XML) назад із сервера, але dataType: jsonвін говорить jQuery проаналізувати як JSON. Перевірте вкладку "Мережа" в інструментах для розробників Chrome, щоб побачити вміст відповіді сервера.


Я перевірив, і, здається, повертається json належним чином. Ось заголовок відповіді: Access-Control-Allow-Origin: * Кеш-контроль: без кешу Довжина вмісту: 2487 Тип вмісту: application / json; charset = utf-8 Дата: вторник, 17 травня 2016 15:34:00 GMT ETag: W / "9b7-yi1 / G0RRpr0DlOVc9u7cMw" X-Powered-By: Express
— Cameron Sima

1
@AVI Я вважаю, що ви повинні вказати тип MIME у своєму ресурсному класі. (наприклад)@Produces(MediaType.APPLICATION_JSON)
— DJ2

10

Це закінчилось проблемою дозволів для мене. Я намагався отримати доступ до URL-адреси, на який я не мав авторизації з cancan, тому URL-адресу було перемкнено users/sign_in. перенаправлений URL відповідає HTML, а не json. Перший символ у відповіді html - це <.


і коли ви отримаєте HTML як відповідь .. як ви можете перенаправити цей HTML? Дякую.
— JuMoGar

1
У мене було те саме, хоча в ASP.NET MVC. Для інших .NETters я забув прикрасити свою дію атрибутом [AllowAnonymous], тому фреймворк намагався повернути мені несанкціоновану помилку в HTML, яка припиняла мій дзвінок AJAX.
— Джейсон Марселл

8

У мене виникла помилка "SyntaxError: Несподіваний маркер m в JSON в положенні", де маркер "m" може бути будь-якими іншими символами.

Виявилося, що я пропустив одну з подвійних лапок в об’єкті JSON, коли використовував RESTconsole для тесту DB, як {"name:" math "}, правильним має бути {" name ":" math "}

Мені знадобилося чимало зусиль, щоб зрозуміти цю незграбну помилку. Я боюся, що інші натраплять на подібні обриви.


5

У моєму випадку я отримував цей запущений веб-пакет, і він виявився десь у корупції десь у локальному режимі node_modules.

rm -rf node_modules
npm install

... було достатньо, щоб він знову працював.


1
разом з цим я спробував видалити package-lock.json. Тоді це працювало на мене.
— Махеш

3

У моєму випадку помилка була результатом того, що я не присвоював моєму поверненню значення змінній. Повідомлення про помилку спричинило:

return new JavaScriptSerializer().Serialize("hello");

Я змінив його на:

string H = "hello";
return new JavaScriptSerializer().Serialize(H);

Без змінної JSON не в змозі належним чином форматувати дані.


3

Ця помилка виникає, коли ви визначаєте відповідь як application/jsonі ви отримуєте HTML як відповідь. В основному це сталося, коли ви пишете скрипт на стороні сервера для конкретного URL-адреси з відповіддю JSON, але формат помилки знаходиться в HTML.




1

У мене було те саме повідомлення про помилку після навчального посібника. Як видається, наша проблема "url: this.props.url" у виклику Ajax. У React.DOM, коли ви створюєте свій елемент, моя виглядає приблизно так.

ReactDOM.render(
    <CommentBox data="/api/comments" pollInterval={2000}/>,
    document.getElementById('content')
);

Що ж, цей коментарний бокс не має URL-адреси у своїх реквізитах, а лише дані. Коли я переключився url: this.props.url-> url: this.props.data, він здійснив правильний дзвінок на сервер, і я повернув очікувані дані.

Я сподіваюся, що це допомагає.


1

Моя проблема полягала в тому, що я повертав дані у форматі, stringякий не був у належному форматі JSON, який я тоді намагався проаналізувати. simple example: JSON.parse('{hello there}')подасть помилку в h. У моєму випадку URL зворотного дзвінка повертав непотрібний символ перед об'єктами: employee_names([{"name":....і ставала помилка при e на 0. У моїй URL-адресі зворотного виклику сама проблема виникла, коли після виправлення поверталися лише об'єкти.


1

У моєму випадку для сайту Azure Angular 2/4 мій виклик API на mySite / api / ... перенаправлявся через проблеми маршрутизації mySite. Отже, він повертав HTML із перенаправленої сторінки замість api JSON. Я додав виключення у файл web.config для шляху api.

Я не отримував цієї помилки під час локальної розробки, оскільки Сайт та API були в різних портах. Мабуть, є кращий спосіб зробити це ... але це спрацювало.

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <system.webServer>
        <rewrite>
        <rules>
        <clear />

        <!-- ignore static files -->
        <rule name="AngularJS Conditions" stopProcessing="true">
        <match url="(app/.*|css/.*|fonts/.*|assets/.*|images/.*|js/.*|api/.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
        <action type="None" />
        </rule>

        <!--remaining all other url's point to index.html file -->
        <rule name="AngularJS Wildcard" enabled="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
        <action type="Rewrite" url="index.html" />
        </rule>

        </rules>
        </rewrite>
    </system.webServer>
</configuration>

1

Це може бути старим. Але, це було просто кутово, тип вмісту для запиту та відповіді в моєму коді відрізнявся. Отже, перевірте заголовки,

 let headers = new Headers({
        'Content-Type': 'application/json',
        **Accept**: 'application/json'
    });

в аксіосах Реагувати

axios({
  method:'get',
  url:'http://  ',
 headers: {
         'Content-Type': 'application/json',
        Accept: 'application/json'
    },
  responseType:'json'
})

jQuery Ajax:

 $.ajax({
      url: this.props.url,
      dataType: 'json',
**headers: { 
          'Content-Type': 'application/json',
        Accept: 'application/json'
    },**
      cache: false,
      success: function (data) {
        this.setState({ data: data });
      }.bind(this),
      error: function (xhr, status, err) {
        console.error(this.props.url, status, err.toString());
      }.bind(this)
    });
  },

1

У двох словах, якщо ви отримуєте цю помилку чи подібну помилку, це означає лише одне. Тобто, десь у нашій кодовій базі ми очікували, що обробляється дійсний формат JSON, і ми його не отримували. Наприклад:

var string = "some string";
JSON.parse(string)

Викине помилку, сказавши

Uncaught SyntaxError: Несподіваний маркер s у JSON у позиції 0

Тому що, перший символ у & stringє sзараз не дійсним JSON. Це також може призвести до помилок між ними. подібно до:

var invalidJSON= '{"foo" : "bar", "missedquotehere : "value" }';
JSON.parse(invalidJSON)

Викине помилку:

VM598:1 Uncaught SyntaxError: Unexpected token v in JSON at position 36

тому що ми навмисно пропустили цитату в рядку JSON invalidJSON в позиції 36.

А якщо ви виправите це:

var validJSON= '{"foo" : "bar", "missedquotehere : "value" }';
JSON.parse(validJSON)

дасть вам об’єкт в JSON.

Тепер цю помилку можна викинути в будь-яке місце та в будь-яку рамку / бібліотеку. Більшу частину часу ви можете читати відповідь мережі, яка не є дійсною JSON. Отже, кроки налагодження цієї проблеми можуть бути такими:

  1. curl або натисніть фактичний API, який ви телефонуєте.
  2. Увійдіть / скопіюйте відповідь та спробуйте її розібрати JSON.parse. Якщо ви отримуєте помилку, виправте її.
  3. Якщо ні, переконайтеся, що ваш код не мутує / не змінює вихідну відповідь.

0

Провівши багато часу з цим, я з'ясував, що в моєму випадку проблема в тому, що "домашня сторінка", визначена в моєму файлі package.json, змусила мою програму не працювати на firebase (така ж "помилка"). Я створив свою програму react за допомогою create-react-app, потім застосував посібник firebase по файлу READ.me для розгортання на сторінках github, зрозумів, що мені потрібно зробити додаткову роботу для роботи маршрутизатора, і перейшов на firebase. Посібник github додав ключ домашньої сторінки на package.json і викликав проблему розгортання.


0

Підказка: Тестування json на локальному сервері Node.js? Переконайтеся, що у вас вже немає чогось маршрутизації до цього шляху

'/:url(app|assets|stuff|etc)';

0

На загальному рівні ця помилка виникає при аналізі об'єкта JSON, який має в ньому синтаксичні помилки. Придумайте щось подібне, де властивість повідомлення містить подвійні подвійні лапки:

{
    "data": [{
        "code": "1",
        "message": "This message has "unescaped" quotes, which is a JSON syntax error."
    }]
}

Якщо у вашому додатку десь є JSON, тоді добре запустити його через JSONLint, щоб переконатися, що в ньому немає синтаксичної помилки. Зазвичай це не так, хоча, на мій досвід, винуватцем є JSON, що повертається з API.

Коли запит XHR робиться до HTTP API, який повертає відповідь з а Content-Type:application/json; charset=UTF-8 заголовком, який містить недійсний JSON в тілі відповіді, ви побачите цю помилку.

Якщо контролер API на стороні сервера неправильно обробляє помилку синтаксису і роздруковується як частина відповіді, це порушить структуру повернутого JSON. Хорошим прикладом цього може бути відповідь API, що містить попередження або повідомлення про PHP у тілі відповідей:

<b>Notice</b>:  Undefined variable: something in <b>/path/to/some-api-controller.php</b> on line <b>99</b><br />
{
    "success": false,
    "data": [{ ... }]
}

У 95% часу це питання для мене джерело, і хоча це дещо розглядається тут, в інших відповідях, я не відчував, що це було чітко описано. Сподіваємось, це допоможе, якщо ви шукаєте зручний спосіб відстежити, який відповідь API містить помилку синтаксису JSON, я написав для цього кутовий модуль .

Ось модуль:

/**
 * Track Incomplete XHR Requests
 * 
 * Extend httpInterceptor to track XHR completions and keep a queue 
 * of our HTTP requests in order to find if any are incomplete or 
 * never finish, usually this is the source  of the issue if it's 
 * XHR related
 */
angular.module( "xhrErrorTracking", [
        'ng',
        'ngResource'
    ] )
    .factory( 'xhrErrorTracking', [ '$q', function( $q ) {
        var currentResponse = false;

        return {
            response: function( response ) {
                currentResponse = response;
                return response || $q.when( response );
            },
            responseError: function( rejection ) {
                var requestDesc = currentResponse.config.method + ' ' + currentResponse.config.url;
                if ( currentResponse.config.params ) requestDesc += ' ' + JSON.stringify( currentResponse.config.params );

                console.warn( 'JSON Errors Found in XHR Response: ' + requestDesc, currentResponse );

                return $q.reject( rejection );
            }
        };
    } ] )
    .config( [ '$httpProvider', function( $httpProvider ) {
        $httpProvider.interceptors.push( 'xhrErrorTracking' );
    } ] );

Більш детальну інформацію можна знайти в статті блогу, згаданої вище, я не розміщував тут все, що це, мабуть, не все актуально.


0

Для мене це сталося, коли один із властивостей об’єкта, якому я повертався, коли JSON кинув виняток.

public Dictionary<string, int> Clients { get; set; }
public int CRCount
{
    get
    {
        var count = 0;
        //throws when Clients is null
        foreach (var c in Clients) {
            count += c.Value;
        }
        return count;
    }
}

Додавши нульовий чек, виправили це для мене:

public Dictionary<string, int> Clients { get; set; }
public int CRCount
{
    get
    {
        var count = 0;
        if (Clients != null) {
            foreach (var c in Clients) {
                count += c.Value;
            }
        }
        return count;
    }
}

0

просто щось основне для перевірки, переконайтеся, що у вас немає нічого прокоментованого у файлі json

//comments here will not be parsed and throw error

0

Просто для додання відповідей, це також відбувається, коли відповідь вашої API включає

<?php{username: 'Some'}

що може бути випадком, коли ваш бекенд використовує PHP.


0

У python ви можете використовувати json.Dump (str) перед тим, як відправити результат у HTML-шаблон. за допомогою цього командного рядка конвертуйте у правильний формат json та надішліть у HTML-шаблон. Після відправлення цього результату на JSON.parse (результат), це правильна відповідь, і ви можете використовувати це.


0

Для когось це може допомогти вам, хлопці: у мене був подібний досвід роботи з Wordpress REST API. Я навіть використовував Postman, щоб перевірити, чи маю правильні маршрути чи кінцеву точку. Пізніше я дізнався, що випадково я помістив "відлуння" всередині свого сценарію - гачки:

Налагодження та перевірка консолі

Причина помилки

В основному це означає, що я надрукував значення, яке не є JSON, що змішується зі сценарієм, який викликає помилку AJAX - "SyntaxError: Несподіваний маркер r в JSON в позиції 0"


0

Це може призвести до того, що ваш код JavaScript переглядає якусь відповідь json, і ви отримали щось інше, як текст.


1
Будь ласка, уточнюйте, надаючи відповіді, а не даючи один вкладиш, якщо вони прямо не вирішують відповіді. Пояснення допоможе шукачам відповідей краще зрозуміти рішення.
— Рай

0

У мене була така ж проблема. Я використовую простий сервер node.js для надсилання відповіді клієнту, зробленому в Angular 7. Спочатку я надсилав response.end ("Привіт, світ з сервера nodejs"); для клієнта, але якось кутовий не зміг його розібрати.


0

Ті, хто користується create-react-app та намагається отримати локальні файли json.

Як і в create-react-app, webpack-dev-serverвикористовується для обробки запиту і для кожного запиту він обслуговує index.html. Так ви отримуєте

SyntaxError: Несподіваний маркер <в JSON в позиції 0.

Щоб вирішити це, потрібно вийняти додаток і змінити webpack-dev-serverфайл конфігурації.

Ви можете виконувати кроки звідси .


0

У моєму випадку (бекенд) я використовував res.send (маркер);

Все виправлено, коли я змінив на res.send (дані);

Ви можете перевірити це, якщо все працює та розміщується за призначенням, але помилка не змінюється у вашій передній частині.


0

Можливості цієї помилки величезні.

У моєму випадку я виявив, що до цього питання додано homepageподане подане package.jsonповідомлення.

Варто перевірити: у package.jsonзміні:

homepage: "www.example.com"

до

hompage: ""   

-2

Якщо хтось інший використовує витяг з документації "Використання вибору" для веб-API в Mozilla: (Це дуже корисно: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch )

  fetch(api_url + '/database', {
    method: 'POST', // or 'PUT'
    headers: {
     'Content-Type': 'application/json'
    },
    body: qrdata //notice that it is not qr but qrdata
  })
  .then((response) => response.json())
  .then((data) => {
    console.log('Success:', data);
  })  
  .catch((error) => {
  console.error('Error:', error);  });

Це було всередині функції:

async function postQRData(qr) {

  let qrdata = qr; //this was added to fix it!
  //then fetch was here
}

Я передавав у свою функцію qrте, що вважав об'єктом, тому що qrвиглядав так: {"name": "Jade", "lname": "Bet", "pet":"cat"}але я продовжував отримувати синтаксичні помилки. Коли я призначив це щось інше: let qrdata = qr;воно спрацювало.


-7

Несподіваний маркер <в JSON в позиції 0

Просте рішення цієї помилки - написати коментар у styles.lessфайл.


48
Це одна з найбільш химерних відповідей, яку я коли-небудь бачив на Stackoverflow.
— Кевін Лірі

Привіт там! Опублікувавши коментар, переконайтеся, що він повністю застосований до фактичного запитання. Ваша відповідь може бути кращою, якщо ви скажете нам, чому саме написання коментарів у styles.lessфайл, можливо, може вирішити те, що видається проблемою із кодом сервера.
— Ендрю Грей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.