«SyntaxError: неожиданный токен <в JSON в позиции 0»

114

В компоненте приложения 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 dev и клиента Chrome REST, и данные выглядят как надлежащие JSON.

ИЗМЕНИТЬ 2:

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

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

  • 7
    Это говорит о том, что ваш "JSON" на самом деле HTML. Посмотрите на данные, которые вы получаете с сервера.
  • 1
    Это ошибка, которую вы получаете, если делаете что-то вроде JSON.parse("<foo>") - строка JSON (которую вы ожидаете с dataType: 'json' ) не может начинаться с < .
Показать ещё 4 комментария

22 ответа

105
Лучший ответ

Текст сообщения об ошибке соответствует тому, что вы получаете из 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
    Спасибо, я сделал это, и вы правы - реакция опрашивает неправильный URL и возвращает содержимое index.html. Я просто не могу понять почему.
  • 6
    Спасибо за дополнительный оператор отладки, хотя мне нужно было использовать console.warn(jqxhr.responseText) . Это очень помогло в диагностике моей проблемы.
Показать ещё 2 комментария
33

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

  • 0
    Я проверил, и, кажется, возвращает правильно отформатированный JSON. Вот заголовок ответа: Access-Control-Allow-Origin: * Cache-Control: без кэширования. Content-Length: 2487 Content-Type: application / json; charset = utf-8 Дата: вт, 17 мая 2016 г. 15:34:00 GMT ETag: W / "9b7-yi1 / G0RRpr0DlOVc9u7cMw" X-Powered-By: Express
  • 0
    это отличный совет, спасибо
Показать ещё 2 комментария
7

Это оказалось проблемой для меня. Я пытался получить доступ к URL-адресу, с которым у меня не было разрешения с cancan, поэтому URL-адрес был переключен на users/sign_in. перенаправленный URL-адрес отвечает на html, а не json. Первый символ в html-ответе <.

  • 0
    и когда вы получаете HTML в качестве ответа .. как вы можете перенаправить на этот HTML? Спасибо.
  • 1
    У меня было то же самое, хотя в ASP.NET MVC. Что касается других .NET, я забыл украсить свое действие атрибутом [AllowAnonymous], поэтому среда пыталась вернуть мне несанкционированную ошибку в HTML, которая приводила к сбою моего вызова AJAX.
5

Я испытал эту ошибку "SyntaxError: Неожиданный токен m в JSON в позиции", где токеном "m" могут быть любые другие символы.

Оказалось, что я пропустил одну из двойных кавычек в объекте JSON, когда я использовал RESTconsole для теста DB, как { "name:" math "}, правильный должен быть {" name ":" math " }

Мне потребовалось много усилий, чтобы выяснить эту неуклюжую ошибку. Я боюсь, что другие столкнутся с подобными обломками.

4

В моем случае я получал этот запущенный веб-пакет, и он оказался некорректным в локальном каталоге node_modules.

rm -rf node_modules
npm install

... было достаточно, чтобы заставить его снова работать.

  • 0
    не помогло еще с той же ошибкой
3

В моем случае ошибка была результатом того, что я не назначил свое возвращаемое значение переменной. Следующее вызвало сообщение об ошибке:

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

Я изменил его на:

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

Без переменной JSON не удается правильно форматировать данные.

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

Эта ошибка возникает, когда вы определяете ответ как application/json, и вы получаете HTML в качестве ответа. В основном это произошло, когда вы пишете серверную часть script для определенного URL-адреса с ответом JSON, но формат ошибки находится в HTML.

1

В моем случае для сайта Angular 2/4, размещенного в Azure, мой 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 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

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

1

У меня было такое же сообщение об ошибке после учебника. Наш вопрос, похоже, "url: this.props.url" в вызове ajax. В React.DOM, когда вы создаете свой элемент, мой выглядит следующим образом.

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

Ну, этот комментарийBox не имеет URL-адреса в своих реквизитах, просто данные. Когда я переключил url: this.props.urlurl: this.props.data, он сделал правильный вызов на сервере, и я вернул ожидаемые данные.

Надеюсь, это поможет.

0

У меня была такая же проблема. Я использую простой сервер node.js для отправки ответа клиенту, выполненному в Angular 7. Изначально я отправлял response.end("Hello world from nodejs server"); клиенту, но каким-то угловатым не удалось разобрать его.

0

Это может быть вызвано тем, что ваш javascript-код просматривает какой-то ответ json, и вы получили что-то еще, например текст.

  • 1
    Пожалуйста, уточняйте, давая ответы, вместо того, чтобы давать один вкладыш, если они не решают прямо. Объяснение поможет ищущим ответов лучше понять решение.
0

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

Отладка и проверка вашей консоли

Причина ошибки

Таким образом, в основном это означает, что я напечатал значение, не являющееся JSON, которое смешано со сценарием, вызывающим ошибку AJAX - "SyntaxError: Неожиданный токен r в JSON в позиции 0"

0

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

0

просто что-то базовое для проверки, убедитесь, что в json файле нет комментариев.

//comments here will not be parsed and throw error
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 с синтаксическими ошибками. Вспомните что-то вроде этого, где свойство message содержит неэксклюзивные двойные кавычки:

{
    "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, я написал модуль Angular для что.

Здесь модуль:

/**
 * 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 
 * 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

Чтобы добавить ответы, это также происходит, когда ваш ответ API включает

<?php{username: 'Some'}

который может быть случайным, когда ваш сервер использует PHP.

0

Protip: тестирование json на локальном сервере Node.js? Убедитесь, что у вас еще нет маршрутизации на этот путь.

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

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

-3

Неожиданный токен < в JSON в позиции 0

Простым решением этой ошибки является запись комментария в файл styles.less.

  • 39
    Это один из самых причудливых ответов, которые я когда-либо видел на Stackoverflow.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню