「SyntaxError:予期しないトークン<JSONの位置0に」


196

Facebookのようなコンテンツフィードを処理するReactアプリコンポーネントで、エラーが発生しています。

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

私はrender関数内の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データをプルすることに関係しているように見えるので、空のデータベースから始めてみましたが、エラーは解決しません。おそらくReactがサーバーへの接続を継続的に試み、最終的にブラウザーをクラッシュさせるため、エラーは無限ループで呼び出されるようです。

編集:

Chrome開発ツールとChrome RESTクライアントでサーバーの応答を確認しましたが、データは適切なJSONのようです。

編集2:

意図されたAPIエンドポイントが実際に正しいJSONデータと形式を返しているにもかかわらず、Reactがhttp://localhost:3000/?_=1463499798727期待されたの代わりにポーリングしているようですhttp://localhost:3001/api/threads

ポート3000でwebpackホットリロードサーバーを実行し、ポート3001でExpressアプリを実行して、バックエンドデータを返しています。ここでイライラしているのは、これが最後に作業したときにこれが正しく機能していて、変更するために変更できる可能性のあるものが見つからないことです。


11
これは、「JSON」が実際にはHTMLであることを示唆しています。サーバーから取得しているデータを確認します。
クエンティン2016年

2
これは、次のような場合に発生するエラーですJSON.parse("<foo>")。JSON文字列(で期待されるdataType: 'json')で始めることはできません<
アプシラー2016年

@quantinが言ったように、それはhtmlかもしれません、多分ある種のエラーかもしれません、残りのクライアントで同じURLを試してください
maurycy

先ほど触れたように、空のdb(単純に[]を返す)で試してみましたが、それでも同じエラーが発生します
Cameron Sima

に応じて、APIリクエストをプロキシする必要がありますNODE_ENV。:この参照github.com/facebookincubator/create-react-app/blob/master/...
ケビンSuttle

回答:


147

エラーメッセージの文言は、実行時に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のコンテンツを返しています。理由がわかりません。
Cameron Sima

8
追加のデバッグステートメントに感謝しますが、を使用する必要がありましたconsole.warn(jqxhr.responseText)。これは私の問題の診断に非常に役立ちました。
user2441511

Mimi314159 @、 console.logconsole.warnおよびconsole.errorすべてのあなたのコンソールに書き込みます。ただし、コンソールには通常、ログフィルターオプションが用意されているので、必要に応じて有効または無効にしてください。
ブライアンフィールド

1
私の場合、サーバーが有効なJSONではなくHTMLを返す原因となったPHPエラーが発生していました。
Derek S

51

サーバーからHTML(またはXML)を受信して​​いますが、dataType: jsonjQueryにJSONとして解析するように指示しています。Chrome開発ツールの[ネットワーク]タブをチェックして、サーバーの応答の内容を確認します。


チェックしたところ、適切にフォーマットされたjsonが返されているようです。これが応答ヘッダーです。Access-Control-Allow-Origin:* Cache-Control:no-cache Content-Length:2487 Content-Type:application / json; charset = utf-8日付:2016年5月17日火曜日15:34:00 GMT ETag:W / "9b7-yi1 / G0RRpr0DlOVc9u7cMw" X-Powered-By:Express
Cameron Sima

1
@AVIリソースクラスでMIMEタイプを指定する必要があると思います。(例)@Produces(MediaType.APPLICATION_JSON)
DJ2

10

これは私にとって権限の問題になりました。cancanで権限のないURLにアクセスしようとしたため、URLがに切り替わりましたusers/sign_in。リダイレクトされたURLはjsonではなくhtmlに応答します。HTML応答の最初の文字は<です。


応答としてHTMLを受け取ったときは、どうすればこのHTMLにリダイレクトできますか?ありがとうございました。
JuMoGar 2017年

1
ASP.NET MVCでも同じです。他の.NETterの場合、[AllowAnonymous]属性を使用してアクションを装飾するのを忘れていたため、フレームワークは、AJAX呼び出しをクラッシュさせるHTMLの不正なエラーを返そうとしました。
Jason Marsell 2017年

8

「SyntaxError:予期しないトークンmがJSONの位置にあります」というエラーが発生しました。トークン「m」は他の任意の文字にすることができます。

DBテストにRESTconsoleを使用しているときに、JSONオブジェクトの二重引用符の1つを見落としたことが判明しました。{"name:" math "}として、正しいものは{" name ":" math "}である必要があります

この不器用な間違いを理解するのに私は多くの努力をしました。私は他の人が同様の困惑にぶつかるのではないかと心配しています。


5

私の場合、私はこの実行中のwebpackを取得していましたが、ローカルのnode_modules dirのどこかに破損があることがわかりました。

rm -rf node_modules
npm install

...再び正しく機能させるには十分でした


1
これとともに、package-lock.jsonを削除してみました。その後、それは私のために働いた。
Mahesh

3

私の場合、エラーは、戻り値を変数に割り当てなかった結果です。エラーメッセージの原因は次のとおりです。

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

私はそれを次のように変更しました:

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

変数JSONがないと、データを適切にフォーマットできません。


3

このエラーは、応答をとして定義し、応答としてapplication/jsonHTMLを取得しているときに発生します。基本的に、これは、JSONの応答を持つ特定のURLのサーバー側スクリプトを記述しているときに発生しましたが、エラー形式はHTMLです。



2

$ .ajaxメソッドからdataType : 'json'を
削除したのと同じ問題に直面していました


1

チュートリアルの後に同じエラーメッセージが表示されました。私たちの問題は、ajax呼び出しの「url:this.props.url」のようです。要素を作成しているときのReact.DOMでは、私のように見えます。

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

ええと、このCommentBoxの小道具にはURLがなく、データだけがあります。私が切り替えたときurl: this.props.url-> url: this.props.data、それはサーバーへの正しい呼び出しを行い、期待されたデータを取り戻しました。

お役に立てば幸いです。


1

私の問題はstring、適切なJSON形式ではない形式でデータを取得し、それを解析しようとしていたことです。simple example: JSON.parse('{hello there}')hでエラーが発生します。私の場合、コールバックURLはオブジェクトの前に不要な文字を返していemployee_names([{"name":....ました。0でeでエラーが発生していました。コールバックURL自体に問題があり、修正するとオブジェクトのみが返されました。


1

私の場合、AzureがホストするAngular 2/4サイトの場合、mySiteルーティングの問題が原因で、mySite / api / ...への私のAPI呼び出しがリダイレクトされていました。つまり、API JSONではなくリダイレ​​クトされたページからHTMLを返していました。apiパスの除外をweb.configファイルに追加しました。

サイトと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'
    });

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

0

これに多くの時間を費やした後、私の場合、package.jsonファイルに「ホームページ」が定義されていると、アプリがFirebaseで動作しなくなる(同じ「トークン」エラー)ことが問題であることがわかりました。create-react-appを使用して反応アプリを作成し、次にREAD.meファイルのfirebaseガイドを使用してgithubページにデプロイしました。ルーターが機能するために追加の作業を行う必要があることに気付き、firebaseに切り替えました。githubガイドはpackage.jsonにホームページキーを追加しており、デプロイの問題を引き起こしていました。


0

Protip:ローカルのNode.jsサーバーでjsonをテストしていますか?そのパスへのルーティングがまだないことを確認してください

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

0

一般的に、このエラーは、構文エラーのあるJSONオブジェクトが解析されるときに発生します。メッセージプロパティにエスケープされていない二重引用符が含まれている次のようなものを考えてください。

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

アプリのどこかにJSONがある場合は、JSONLintを介して実行し、構文エラーがないことを確認することをお勧めします。通常、これは当てはまりませんが、私の経験では、原因であるAPIから返されるJSONが通常です。

Content-Type:application/json; charset=UTF-8応答本文に無効なJSONを含むヘッダーを含む応答を返すHTTP APIに対してXHR要求が行われると、このエラーが表示されます。

サーバー側のAPIコントローラーが構文エラーを不適切に処理し、それが応答の一部として出力される場合、返されるJSONの構造が壊れます。この良い例は、応答の本文にPHPの警告または通知を含むAPI応答です。

<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%がこれが私にとって問題の原因であり、他の応答では多少取り上げられていますが、明確に説明されているとは思われませんでした。うまくいけば、これが役立つでしょう。JSON構文エラーが含まれているAPI応答を追跡する便利な方法を探している場合は、そのための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'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として返すオブジェクトのプロパティの1つが例外をスローしたときに発生しました。

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

nullチェックを追加し、修正しました。

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では、結果をHTMLテンプレートに送信する前にjson.Dump(str)を使用できます。このコマンド文字列を使用して、正しいjson形式に変換し、htmlテンプレートに送信します。この結果をJSON.parse(result)に送信すると、これは正しい応答であり、これを使用できます。


0

一部の人にとって、これは皆さんに役立つかもしれません。私はWordpress REST APIで同様の経験をしました。Postmanを使用して、正しいルートまたはエンドポイントがあるかどうかを確認しました。スクリプトの中に誤って "エコー"を入れてしまったことが後でわかりました-フック:

コンソールをデバッグして確認する

エラーの原因

つまり、これは基本的に、AJAXエラーを引き起こすスクリプトと混合されたJSONではない値を出力したことを意味します-"SyntaxError:予期しないトークンrがJSONの位置0にあります"


0

これは、JavaScriptコードがいくつかのJSON応答を見ていて、テキストのような何かを受け取ったことが原因である可能性があります。


1
彼らが完全に答えを解決しない限り、1つのライナーを与えるのではなく、答えを出す間、詳しく説明してください。この説明は、回答を求める人がソリューションをよりよく理解するのに役立ちます。
Rai

0

私は同じ問題を抱えていました。単純なnode.jsサーバーを使用して、Angular 7で作成されたクライアントに応答を送信しています。最初は、response.end( 'Hello world from nodejs server');を送信していました。クライアントに、しかしどういうわけかそれを解析できませんでした。


0

create-react-appローカルのjsonファイルを使用してフェッチしようとしている人。

と同様にcreate-react-appwebpack-dev-serverはリクエストを処理するために使用され、すべてのリクエストに対してを提供しindex.htmlます。だからあなたは得ています

SyntaxError:JSONの位置0に予期しないトークン<があります。

これを解決するには、アプリをイジェクトし、webpack-dev-server構成ファイルを変更する必要があります。

ここから手順を実行できます。


0

私の場合(バックエンド)、res.send(token);を使用していました。

res.send(data)に変更すると、すべてが修正されました。

すべてが正常に機能し、意図したとおりに投稿されている場合は、これを確認することをお勧めしますが、エラーがフロントエンドに表示され続けます。


0

このエラーの可能性は圧倒的です。

私の場合、問題が原因でhomepageファイルに追加されていることがわかりましたpackage.json

価値のあるチェック:package.json変更:

homepage: "www.example.com"

hompage: ""   

0

簡単に言えば、このエラーまたは同様のエラーが発生した場合、それは1つのことだけを意味します。つまり、コードベースのどこかで有効なJSON形式を処理することを期待していて、取得できませんでした。例えば:

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

エラーをスローして言って

キャッチされないSyntaxError:位置0のJSONの予期しないトークンs

なぜなら、の最初の文字strings&であり、現在は有効なJSONではないからです。これも間にエラーをスローする可能性があります。お気に入り:

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

エラーをスローします:

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

invalidJSON位置36のJSON文字列の引用符を意図的に省略したためです。

そしてあなたがそれを修正した場合:

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

JSONでオブジェクトを取得します。

現在、このエラーは、任意の場所および任意のフレームワーク/ライブラリで発生する可能性があります。ほとんどの場合、有効なJSONではないネットワーク応答を読み取っている可能性があります。したがって、この問題をデバッグする手順は次のようになります。

  1. curl または、呼び出している実際のAPIにアクセスします。
  2. 応答をログ/コピーして、で解析してみてくださいJSON.parse。エラーが発生した場合は修正してください。
  3. そうでない場合は、コードが元の応答を変更または変更していないことを確認してください。

-2

他の誰かがMozillaのWeb APIの「Using Fetch」ドキュメントからフェッチを使用している場合:(これは本当に便利です: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で今まで見た中で最も奇妙な答えの1つです。
Kevin Leary 2017

こんにちは!コメントを投稿するときは、実際の質問に完全に当てはまることを確認してください。styles.lessファイルにコメントを正確に書き込むことで、バックエンドサーバーコードの問題と思われるものを解決できる可能性がある理由を教えてください。
Andrew Grey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.