“ SyntaxError:JSON中位置0处的意外令牌<”


196

在处理类似于Facebook的内容提要的React应用程序组件中,我遇到了一个错误:

Feed.js:94未定义的“ parsererror”“ SyntaxError:JSON中位置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。查看您从服务器获取的数据。
昆汀

2
如果您执行类似的操作,这就是您遇到的错误JSON.parse("<foo>")-JSON字符串(您期望使用dataType: 'json')不能以开头<
Apsillers

正如@quantin所说的,它可能是html,也许是某种错误,请与一些其他客户端尝试相同的url
maurycy

像我所提到的,我尝试了用空分贝(返回简单[]),它仍然给出了同样的错误
卡梅伦司马

您最有可能需要根据自己的代理来请求API请求NODE_ENV。看到这个:github.com/facebookincubator/create-react-app/blob/master/…–
Kevin Suttle

Answers:


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的内容。我只是找不到原因。
卡梅隆·司马

8
感谢您提供其他调试语句,尽管我需要使用console.warn(jqxhr.responseText)。那对诊断我的问题很有帮助。
user2441511 '16

@ Mimi314159, console.logconsole.warn并且console.error将所有写入到控制台。但是,控制台通常会提供“日志记录筛选器”选项,因此请确保根据需要启用或禁用这些选项。
布赖恩·菲尔德

1
以我为例,发生了一个PHP错误,导致服务器返回HTML而不是有效的JSON。
德里克S

50

您正在从服务器返回HTML(或XML),但是dataType: json告诉jQuery解析为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类型。(eg)@Produces(MediaType.APPLICATION_JSON)
DJ2

10

这最终成为我的权限问题。我试图通过Cancan访问未经授权的网址,因此该网址已切换为users/sign_in。重定向的url响应html,而不响应json。html响应中的第一个字符是<


并且当您收到HTML作为响应时。.如何重定向到该HTML?谢谢。
JuMoGar

1
尽管在ASP.NET MVC中,我也一样。对于其他.NETters,我忘了用[AllowAnonymous]属性修饰动作,因此框架试图向我返回HTML中的未授权错误,该错误使我的AJAX调用崩溃了。
杰森·马塞尔

8

我遇到此错误“ SyntaxError:JSON中位置处的意外令牌m”,其中令牌“ m”可以是任何其他字符。

原来,当我使用RESTconsole进行数据库测试时,我错过了JSON对象中的双引号之一,例如{“ name:” math“},正确的应该是{” name“:” math“}

我花了很多精力来找出这个笨拙的错误。恐怕其他人会遇到类似的麻烦。


5

就我而言,我正在运行此Webpack,结果证明是本地node_modules目录中的某些损坏。

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/json并且您将HTML作为响应时,会发生此错误。基本上,这是在您为带有JSON响应的特定URL编写服务器端脚本时发生的,但错误格式为HTML。




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":....并且在e处出现错误0。我的回调URL本身存在一个问题,该问题在修复后仅返回对象。


1

就我而言,对于一个Azure托管的Angular 2/4站点,由于mySite路由问题,我对mySite / api / ...的API调用正在重定向。因此,它是从重定向页面而不是api JSON返回HTML。我在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'
    });

在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创建了我的react应用,然后使用READ.me文件上的firebase指南部署到github页面,意识到我必须做额外的工作才能使路由器正常工作,然后切换到firebase。github指南已在package.json上添加了主页密钥,并导致了部署问题。


0

Protip:在本地Node.js服务器上测试json?确保您还没有路由到该路径的东西

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

0

一般而言,当解析包含语法错误的JSON对象时,会发生此错误。考虑一下这样的情况,其中message属性包含未转义的双引号:

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

如果您的应用程序中有JSON,则最好通过JSONLint运行它以验证它没有语法错误。根据我的经验,通常情况并非如此,通常是罪魁祸首从API返回的JSON。

当对HTTP API发出XHR请求,该请求返回的响应的Content-Type:application/json; charset=UTF-8标头在响应正文中包含无效的JSON时,您会看到此错误。

如果服务器端API控制器未正确处理语法错误,并将其作为响应的一部分打印出来,则将破坏返回的JSON的结构。一个很好的例子是响应正文中包含PHP Warning或Notice的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%的时间对我来说是问题的根源,尽管在其他回复中对此有所说明,但我认为并没有清楚地描述它。希望这对您有帮助,如果您正在寻找一种方便的方法来查找哪个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'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

在python中,您可以在将结果发送到html模板之前使用json.Dump(str)。使用此命令字符串转换为正确的json格式并发送到html模板。将结果发送到JSON.parse(result)之后,这是正确的响应,您可以使用它。


0

对于某些人来说,这可能对您有所帮助:我在Wordpress REST API方面也有类似的经验。我什至用邮差来检查我是否有正确的路由或端点。后来我发现我不小心在脚本中放了一个“ echo”-钩子:

调试并检查您的控制台

错误原因

因此,基本上,这意味着我打印的值不是与导致AJAX错误的脚本混合的JSON-“ SyntaxError:JSON中位置0处的意外令牌r”


0

这可能是由于您的JavaScript代码正在查看json响应而您收到的其他内容(例如文本)所致。


1
除非他们完全解决问题,否则请在给出答案时详细说明,而不要给出一个衬线。这种解释将有助于寻求答案的人更好地理解解决方案。
Rai

0

我有同样的问题。我正在使用一个简单的node.js服务器将响应发送到Angular 7中制作的客户端。最初,我正在发送response.end('来自nodejs服务器的Hello world'); 客户端,但不知何故Angular无法解析它。


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

简而言之,如果您遇到此错误或类似错误,那仅意味着一件事。也就是说,在我们的代码库中的某个地方,我们期望能够处理有效的JSON格式,但没有得到。例如:

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

会抛出一个错误,说

未捕获到的SyntaxError:JSON中位置0处的意外令牌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的“使用获取”文档中的获取:(这真的很有用: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文件中完全写入注释可以解决似乎是后端服务器代码的问题,那么您的答案可能会更好。
安德鲁·格雷
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.