语法错误:在JSON的位置0处出现意外的C令牌

7
我在我的应用程序中有这部分代码。
addComment (body: Object): Observable<Comment[]> {
    //let bodyString = JSON.stringify(body); // Stringify payload
    let bodyString = JSON.parse(JSON.stringify(body || null ))
    let headers = new Headers({ 'Content-Type': 'application/json' }); // ... Set content type to JSON
    let options = new RequestOptions({ headers: headers }); // Create a request option

    return this.http.post(this.commentsUrl, bodyString, options) // ...using post request
                        .map((res:Response) => res.json()) // ...and calling .json() on the response to return data
                        .catch((error:any) => Observable.throw(error.json().error || 'Server error')); //...errors if any
}   

当我尝试在我的应用程序中添加评论时,它会抛出以下错误:
POST http://localhost:4200/assets/comments.json 404 (Not Found)   
SyntaxError: Unexpected token C in JSON at position 0

有人可以帮我吗?

SyntaxError的完整堆栈:

SyntaxError: Unexpected token C in JSON at position 0
    at Object.parse (<anonymous>)
    at Response.Body.json (body.js:24)
    at CatchSubscriber.selector (comment.service.ts:41)
    at CatchSubscriber.error (catch.js:104)
    at MapSubscriber.Subscriber._error (Subscriber.js:128)
    at MapSubscriber.Subscriber.error (Subscriber.js:102)
    at XMLHttpRequest.onLoad (xhr_backend.js:82)
    at ZoneDelegate.webpackJsonp.1301.ZoneDelegate.invokeTask (zone.js:363)
    at Object.onInvokeTask (ng_zone.js:264)
    at ZoneDelegate.webpackJsonp.1301.ZoneDelegate.invokeTask (zone.js:362)
    at Zone.webpackJsonp.1301.Zone.runTask (zone.js:166)
    at XMLHttpRequest.ZoneTask.invoke (zone.js:416)

我们能看一下你如何调用 addComment 吗? - YounesM
2
为什么要进行字符串化,然后解析? - Adnan A.
你能附加SyntaxError堆栈,以指示哪行代码抛出错误吗?当调用addComment时,this.model对象的值是什么? - shaochuancs
@shaochuancs,this.model的值为[object Object]。 - Dea
根据堆栈信息,SyntaxError 源自于 Response.Body.json (body.js:24)CatchSubscriber.selector (comment.service.ts:41)。请问在你的代码中出现了哪一个?它指示的是哪一行? - shaochuancs
6个回答

8

我遇到了完全相同的问题。

只需要更改:

error.json()

to

JSON.parse(JSON.stringify(error))

运行得非常顺畅!! :) - Anurag_BEHS

3
你可能已经回显了以 C 开头的内容,例如 Connected。通常情况下,只应该回显 JSON 响应而不是任何字符串!

1
我遇到了类似的问题。我发现Angular不支持Spring Boot返回类型为ResponseEntity<String>的函数。
return ResponseEntity.ok().body(new String("Some Message"));

我将其更改为ResponseEntity<ResponseMessage>,并修改返回结果如下:
return ResponseEntity.status(HttpStatus.OK).body(new ResponseMessage("Some Message"));

它起作用了。 ResponseMessage类包含的内容。
  public class ResponseMessage {
  private String message;

  public ResponseMessage(String message) {
    this.message = message;
  }

  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }

}

感谢 Stackoverflow 社区。这是我的第一个回答。

0

当我的php文件包含连接成功的消息时,我遇到了类似的错误。当我除了json_encode()之外删除所有echo命令时,它可以正常工作。因此,请确保在您的php文件中只有echo json_encode($data)的输出。


0

当我尝试在请求中发送空主体时,我遇到了类似的问题。您能确认发送的主体不是未定义的吗?

您可以尝试在发送之前添加一个条件,检查主体是否包含内容。


0
可以尝试使用这段代码吗?
例子
  addComment(user: ApiDashboard) {
   return this.http.post(this.commentsUrl,user).map(response => 
   response.json());
   }

你可以尝试使用

  addComment(user: Comment) {
   return this.http.post(this.commentsUrl,user).map(response => 
   response.json());
   }

这里的注释是模型文件

例如

export class ApiDashboard {
id: string;
name: string;
price: number;
 }
  • 当你在我的案例中的服务文件中打印了一些值时,会出现这种情况。

service.ts

 private handleError(error: any): Promise<any> {
//console.error('An error occurred', error); 
return Promise.reject(error.message || error);
 }

我注释掉了 console.log(),然后它可能会正常运行,你可以尝试一下解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接