"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.