【问题标题】:Unable to parse a valid JSON无法解析有效的 JSON
【发布时间】:2019-02-08 13:06:43
【问题描述】:

我的 api 使用 PHP Silex 发回这样的 JSON 响应:

{"response":true,"message":"Bla","userId":"AAA"}

但我无法在我的 Typescript 前端解析它

this.authService.login(body).then((result : any)  => {
    console.log(result.data); // => {"response":true,"message":"Bla","userId":"AAA"}         
    let parsed = JSON.parse(result.data);
    console.log(parsed.message); // => throws  "SyntaxError: Unexpected token in JSON at position 0\n at JSON.parse (<anonymous>)

我使用 PHP 和 Silex 框架的 php 端点:

$app->post('/user/login', function (Request $request) use ($app, $config) {
    $email = $request->request->get('user-email');
    $password = $request->request->get('user-password');
    $rsp = loginUser($email,$password);
    return $app->json($rsp);
});

当尝试将 json 对象硬编码为代码时,它会解析!

更新解决方案 我不得不对 result.data 使用 trim() 来删除空格,somehome 的响应带有空格,而 JSON 不喜欢这样。谢谢大家的帮助。

【问题讨论】:

  • 可能是空格使用 trim()
  • console.log(typeof result.data); ?
  • @DieterKräutl 但 JSON 标记之间允许有空格
  • 数据好像已经解析过了。
  • console.log(result.data.message) 显示什么?

标签: javascript php json typescript silex


【解决方案1】:

您的 PHP 代码中可能有一个 \u0000 字符。

从 PHP 获取 JSON 字符串后,尝试从 JSON 字符串中删除这些字符:

this.authService.login(body).then((result : any)  => {
    string = result.data.replace("\u0000", "");
    string = string.replace("\\u0000", "");
    let parsed = JSON.parse(string);

【讨论】:

  • 为什么要双重替换?根据 OP 的控制台输出,他们的数据中显然没有文字字符串 \u0000。然而,一个实际的空字符(或其他一些不可见的控制字符)是相当合理的。
【解决方案2】:

解决方案

我使用 result.data.trim() 让它工作,不知何故响应有空格,JSON 不喜欢那样。

【讨论】:

猜你喜欢
  • 2011-12-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
相关资源
最近更新 更多