"SyntaxError: token imprevisto <in JSON nella posizione 0"


199

In un componente dell'app React che gestisce feed di contenuti simili a Facebook, sto riscontrando un errore:

Feed.js: 94 non definito "parsererror" "SintassiError: token imprevisto <in JSON in posizione 0

Mi sono imbattuto in un errore simile che si è rivelato un errore di battitura nell'HTML all'interno della funzione di rendering, ma qui non sembra essere il caso.

Più confusamente, ho riportato il codice a una versione precedente e funzionante e sto ancora ricevendo l'errore.

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

Negli strumenti di sviluppo di Chrome, l'errore sembra provenire da questa funzione:

 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)
    });
  },

con la linea console.error(this.props.url, status, err.toString()sottolineata.

Poiché sembra che l'errore abbia qualcosa a che fare con l'estrazione dei dati JSON dal server, ho provato a partire da un db vuoto, ma l'errore persiste. L'errore sembra essere chiamato in un ciclo infinito presumibilmente mentre React tenta continuamente di connettersi al server e alla fine si arresta in modo anomalo nel browser.

MODIFICARE:

Ho verificato la risposta del server con gli strumenti di sviluppo di Chrome e il client Chrome REST e i dati sembrano essere JSON corretti.

MODIFICA 2:

Sembra che sebbene l'endpoint API previsto stia effettivamente restituendo i dati e il formato JSON corretti, React esegue il polling http://localhost:3000/?_=1463499798727invece del previsto http://localhost:3001/api/threads.

Sto eseguendo un server di ricarica rapida Webpack sulla porta 3000 con l'app Express in esecuzione sulla porta 3001 per restituire i dati di back-end. La cosa frustrante qui è che questo funzionava correttamente l'ultima volta che ci ho lavorato e non riesco a trovare cosa avrei potuto cambiare per romperlo.


11
Ciò suggerisce che il tuo "JSON" è in realtà HTML. Guarda i dati che stai recuperando dal server.
Quentin,

2
Questo è l'errore che ricevi se fai qualcosa del genere JSON.parse("<foo>"): una stringa JSON (che ti aspetti con dataType: 'json') non può iniziare <.
apsillers,

Come ha detto @quantin, può essere html, forse un errore di qualche tipo, provare lo stesso URL con alcuni client di riposo
maurycy

come ho già detto, l'ho provato con un db vuoto (che restituisce semplicemente []) e dà ancora lo stesso errore
Cameron Sima,

Molto probabilmente dovrai proxy delle richieste API a seconda del tuo NODE_ENV. Vedi questo: github.com/facebookincubator/create-react-app/blob/master/…
Kevin Suttle il

Risposte:


148

La formulazione del messaggio di errore corrisponde a ciò che ottieni da Google Chrome durante l'esecuzione JSON.parse('<...'). So che hai detto che il server sta impostando Content-Type:application/json, ma sono portato a credere che il corpo della risposta sia in realtà HTML.

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

con la linea console.error(this.props.url, status, err.toString())sottolineata.

In errrealtà è stato lanciato all'interno jQuerye passato a te come una variabile err. Il motivo per cui la linea è sottolineata è semplicemente perché è lì che la stai registrando.

Vorrei suggerire di aggiungere alla registrazione. Osservando le proprietà effettive xhr(XMLHttpRequest) per saperne di più sulla risposta. Prova ad aggiungere console.warn(xhr.responseText)e molto probabilmente vedrai l'HTML che viene ricevuto.


3
Grazie, l'ho fatto e hai ragione: la reazione è il polling dell'URL sbagliato e sta restituendo il contenuto di index.html. Non riesco proprio a scoprire il perché.
Cameron Sima,

8
Grazie per la dichiarazione di debug aggiuntiva, anche se avevo bisogno di usare console.warn(jqxhr.responseText). È stato molto utile per diagnosticare il mio problema.
user2441511

@ Mimi314159, console.log, console.warne console.errorsaranno tutti in scrittura alla console. Tuttavia, la console di solito fornisce le opzioni del filtro di registrazione, quindi assicurati che siano abilitate o disabilitate come preferisci.
Bryan Field,

1
Nel mio caso, si è verificato un errore PHP che ha causato al server di restituire HTML anziché JSON valido.
Derek S,

54

Stai ricevendo HTML (o XML) dal server, ma dataType: jsonsta dicendo a jQuery di analizzare come JSON. Controlla la scheda "Rete" negli strumenti di sviluppo di Chrome per vedere il contenuto della risposta del server.


Ho controllato e sembra che stia restituendo json correttamente formattato. Ecco l'intestazione della risposta: Access-Control-Allow-Origin: * Cache-Control: no-cache Content-Length: 2487 Content-Type: application / json; charset = utf-8 Data: mar, 17 maggio 2016 15:34:00 GMT ETag: W / "9b7-yi1 / G0RRpr0DlOVc9u7cMw" X-Powered-By: Express
Cameron Sima

1
@AVI Credo che tu debba specificare il tipo MIME nella tua classe di risorse. (ad es.)@Produces(MediaType.APPLICATION_JSON)
DJ2,

10

Questo ha finito per essere un problema di autorizzazioni per me. Stavo cercando di accedere a un URL per il quale non avevo l'autorizzazione con Cancan, quindi l'URL è stato cambiato users/sign_in. l'URL reindirizzato risponde a HTML, non JSON. Il primo carattere in una risposta html è <.


e quando ricevi un HTML come risposta .. come puoi reindirizzare a questo HTML? Grazie.
JuMoGar,

1
Ho avuto lo stesso, anche se in ASP.NET MVC. Per altri .NETter, avevo dimenticato di decorare la mia azione con l'attributo [AllowAnonymous], quindi il framework stava cercando di restituirmi l'errore non autorizzato in HTML che stava bloccando la mia chiamata AJAX.
Jason Marsell,

8

Ho riscontrato questo errore "SyntaxError: token imprevisto m in JSON in posizione", in cui il token 'm' può essere qualsiasi altro carattere.

Si è scoperto che ho perso una delle doppie virgolette nell'oggetto JSON quando stavo usando RESTconsole per il test DB, come {"name:" math "}, quello corretto dovrebbe essere {" name ":" math "}

Mi ci è voluto molto sforzo per capire questo errore goffo. Temo che altri si imbatteranno in simili vagabondi.


5

Nel mio caso, stavo ottenendo questo webpack in esecuzione, e si è rivelato essere un po 'di corruzione da qualche parte nella directory node_modules locale.

rm -rf node_modules
npm install

... è stato sufficiente per farlo funzionare di nuovo.


1
insieme a questo, ho provato a rimuovere package-lock.json. Quindi ha funzionato per me.
Mahesh,

3

Nel mio caso l'errore è stato il risultato della mancata assegnazione del mio valore di ritorno a una variabile. Quanto segue ha causato il messaggio di errore:

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

L'ho cambiato in:

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

Senza la variabile JSON non è in grado di formattare correttamente i dati.


3

Questo errore si verifica quando si definisce la risposta come application/jsone si ottiene un HTML come risposta. Fondamentalmente, questo è accaduto quando si sta scrivendo uno script lato server per un URL specifico con una risposta di JSON ma il formato dell'errore è in HTML.


3

stavo affrontando lo stesso problema
ho rimosso il tipo di dati: "json" dal metodo $ .ajax



1

Ho avuto lo stesso messaggio di errore a seguito di un tutorial. Il nostro problema sembra essere "url: this.props.url" nella chiamata ajax. In React.DOM quando crei il tuo elemento, il mio appare così.

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

Bene, questo CommentBox non ha un URL nei suoi oggetti di scena, solo dati. Quando ho cambiato url: this.props.url-> url: this.props.data, ha fatto la chiamata giusta al server e ho recuperato i dati previsti.

Spero possa essere d'aiuto.


1

Il mio problema era che stavo recuperando i dati in un formato stringche non era in un formato JSON appropriato, che stavo quindi cercando di analizzare. simple example: JSON.parse('{hello there}')darà un errore a h. Nel mio caso l'URL di callback stava restituendo un carattere non necessario prima degli oggetti: employee_names([{"name":....e stava ottenendo un errore su e a 0. Il mio stesso URL di callback aveva un problema che, una volta risolto, restituiva solo oggetti.


1

Nel mio caso, per un sito Angular 2/4 ospitato in Azure, la mia chiamata API a mySite / api / ... stava reindirizzando a causa di problemi di routing mySite. Quindi, stava restituendo l'HTML dalla pagina reindirizzata anziché l'API JSON. Ho aggiunto un'esclusione in un file web.config per il percorso API.

Non ho riscontrato questo errore durante lo sviluppo locale perché il sito e l'API si trovavano su porte diverse. C'è probabilmente un modo migliore per farlo ... ma ha funzionato.

<?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

Questo potrebbe essere vecchio. Ma si è appena verificato in angolare, il tipo di contenuto per richiesta e risposta era diverso nel mio codice. Quindi, controlla le intestazioni per,

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

in React axios

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

In breve, se ricevi questo errore o un errore simile, significa solo una cosa. Cioè, da qualche parte nella nostra base di codice ci aspettavamo un formato JSON valido da elaborare e non ne abbiamo ottenuto uno. Per esempio:

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

Emetterà un errore, dicendo

Uncaught SyntaxError: token non previsti in JSON in posizione 0

Perché, il primo personaggio in stringè se non è un JSON valido ora. Questo può generare anche errori. piace:

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

Genera errore:

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

perché abbiamo intenzionalmente perso una citazione nella stringa JSON invalidJSON nella posizione 36.

E se lo risolvi:

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

ti darà un oggetto in JSON.

Ora, questo errore può essere generato in qualsiasi luogo e in qualsiasi framework / libreria. Il più delle volte potresti leggere una risposta di rete che non è JSON valida. Quindi i passaggi per il debug di questo problema possono essere come:

  1. curl o premi l'API effettiva che stai chiamando.
  2. Registra / copia la risposta e prova ad analizzarla JSON.parse. Se ricevi un errore, correggilo.
  3. In caso contrario, assicurarsi che il codice non stia mutando / modificando la risposta originale.

0

Dopo aver trascorso molto tempo con questo, ho scoperto che nel mio caso il problema era avere "homepage" definita sul mio file package.json ha reso la mia app non funzionante su firebase (stesso errore 'token'). Ho creato la mia app di reazione usando create -eagire-app, quindi ho usato la guida firebase sul file READ.me per distribuire pagine github, ho realizzato che dovevo fare un lavoro extra per far funzionare il router e sono passato a firebase. la guida di github aveva aggiunto la chiave della homepage su package.json e ha causato il problema di distribuzione.


0

Protip: test di json su un server Node.js locale? Assicurati di non avere già qualcosa che instrada verso quel percorso

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

0

A livello generale questo errore si verifica quando viene analizzato un oggetto JSON che contiene errori di sintassi. Pensa a qualcosa del genere, in cui la proprietà message contiene virgolette doppie senza escape:

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

Se hai JSON nella tua app da qualche parte, è bene eseguirlo tramite JSONLint per verificare che non abbia un errore di sintassi. Di solito non è così nella mia esperienza, di solito è JSON restituito da un'API che è il colpevole.

Quando viene effettuata una richiesta XHR a un'API HTTP che restituisce una risposta con Content-Type:application/json; charset=UTF-8un'intestazione che contiene JSON non valido nel corpo della risposta, viene visualizzato questo errore.

Se un controller API lato server gestisce erroneamente un errore di sintassi e viene stampato come parte della risposta, ciò spezzerà la struttura di JSON restituita. Un buon esempio di ciò potrebbe essere una risposta API contenente un avviso o avviso PHP nel corpo della risposta:

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

Il 95% delle volte questa è la fonte del problema per me, e sebbene sia stato in qualche modo affrontato qui nelle altre risposte, non pensavo che fosse stato chiaramente descritto. Spero che questo aiuti, se stai cercando un modo pratico per rintracciare quale risposta API contiene un errore di sintassi JSON, ho scritto un modulo angolare per quello .

Ecco il modulo:

/**
 * 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' );
    } ] );

Maggiori dettagli sono disponibili nell'articolo del blog a cui si fa riferimento sopra, non ho pubblicato tutto ciò che è stato trovato qui, poiché probabilmente non è rilevante.


0

Per me, questo è successo quando una delle proprietà sull'oggetto che stavo restituendo mentre JSON ha lanciato un'eccezione.

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;
    }
}

Aggiunta di un controllo null, risolto per me:

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

solo qualcosa di base da controllare, assicurati di non avere nulla di commentato nel file json

//comments here will not be parsed and throw error

0

Solo per aggiungere alle risposte, succede anche quando la risposta dell'API include

<?php{username: 'Some'}

che potrebbe essere un caso quando il tuo back-end utilizza PHP.


0

In python puoi usare json.Dump (str) prima di inviare il risultato al modello html. con questa stringa di comando converti nel formato json corretto e invia al modello html. Dopo aver inviato questo risultato a JSON.parse (risultato), questa è la risposta corretta e puoi usarla.


0

Per alcuni, questo potrebbe aiutarvi ragazzi: ho avuto un'esperienza simile con l'API REST di Wordpress. Ho persino usato Postman per verificare se avevo i percorsi o l'endpoint corretti. In seguito ho scoperto che ho inserito accidentalmente un "eco" nella mia sceneggiatura - hook:

Esegui il debug e controlla la tua console

Causa dell'errore

Quindi, in pratica, questo significa che ho stampato un valore che non è JSON che è mescolato con lo script che causa l'errore AJAX - "SyntaxError: token imprevisto in JSON in posizione 0"


0

Ciò potrebbe causare a causa del codice javascript che sta esaminando una risposta json e hai ricevuto qualcos'altro come il testo.


1
Per favore, elaborate mentre date le risposte piuttosto che dare una linea, a meno che non risolvano completamente le risposte. La spiegazione aiuterebbe i cercatori di risposte a comprendere meglio la soluzione.
Rai,

0

Avevo lo stesso problema. Sto usando un semplice server node.js per inviare la risposta a un client realizzato in Angular 7. Inizialmente stavo inviando response.end ('Hello world from nodejs server'); al cliente ma in qualche modo angolare non è stato in grado di analizzarlo.


0

Coloro che stanno usando create-react-app e provando a recuperare file json locali.

Come in create-react-app, webpack-dev-serverviene utilizzato per gestire la richiesta e per ogni richiesta che serve al index.html. Quindi stai ottenendo

SyntaxError: token imprevisto <in JSON nella posizione 0.

Per risolvere questo problema, devi espellere l'app e modificare il webpack-dev-serverfile di configurazione.

Puoi seguire i passaggi da qui .


0

Nel mio caso (backend), stavo usando res.send (token);

Tutto è stato risolto quando sono passato a res.send (data);

Potresti voler controllare questo se tutto funziona e pubblicare come previsto, ma l'errore continua a comparire nel tuo front-end.


0

Le possibilità di questo errore sono travolgenti.

Nel mio caso, ho scoperto che il problema con l'aggiunta del file homepagearchiviato ha package.jsoncausato il problema.

Vale la pena controllare: in package.jsoncambio:

homepage: "www.example.com"

per

hompage: ""   

-2

Se qualcun altro sta usando fetch dalla documentazione "Using Fetch" sulle API Web di Mozilla: (Questo è davvero utile: 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);  });

Questo era all'interno della funzione:

async function postQRData(qr) {

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

Stavo passando nella mia funzione qrquello che credevo essere un oggetto perché qrassomigliava a questo: {"name": "Jade", "lname": "Bet", "pet":"cat"}ma continuavo a ricevere errori di sintassi. Quando l'ho assegnato a qualcos'altro: let qrdata = qr;ha funzionato.


-7

Token imprevisto <in JSON nella posizione 0

Una soluzione semplice a questo errore è scrivere un commento nel styles.lessfile.


48
Questa è una delle risposte più bizzarre che abbia mai visto su StackOverflow.
Kevin Leary,

Ciao! Quando pubblichi un commento, assicurati che sia del tutto applicabile alla domanda effettiva che viene posta. La tua risposta potrebbe essere migliore se ci dici perché scrivere esattamente i commenti in un styles.lessfile potrebbe eventualmente risolvere quello che sembra essere un problema di codice del server back-end.
Andrew Gray,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.