【问题标题】:JSON.parse generates error with backslashJSON.parse 使用反斜杠生成错误
【发布时间】:2020-02-20 10:09:49
【问题描述】:

为什么JSON.parse解析不到下面的JSON?

{"page_title":"contact us","val":{"pattern":"/email/\s+us\s*(.*?)/\s/","type":"1"}}

当我将result 登录到控制台时,它会给出上述输出。使用JSON.parse 后出现此错误:

Uncaught SyntaxError: Unexpected token s in JSON at position 1649 at JSON.parse () 请参阅下面的代码:

var result ='<?php echo json_encode($output);?>';
console.log(result);
var data = JSON.parse(result);

【问题讨论】:

  • 您在问题中显示的代码工作正常:jsfiddle.net/RoryMcCrossan/epq87nhg
  • var a = '{"page_title":"联系我们","val":{"pattern":"/email/\s+us\s*(.*?)/\s ","type":"1"}}'; var 数据 = JSON.parse(a); console.log(data);
  • json_decode(str_replace('\\',"\\\\", $json), true); 会变魔术。

标签: php jquery json


【解决方案1】:

使用 addlashes 函数,因为您在字符串中使用正则表达式

var result ='<?php echo addslashes(json_encode($output));?>';

【讨论】:

    【解决方案2】:

    简单...不要用单引号包裹您的 json 对象,也不要调用 JSON.parse()

    let result = <?php echo json_encode($output); ?>;
    

    现在result 是一个可以使用的javascript 对象了。

    如果您是 json_encode() 正确,您的字符串将如下所示:

    代码:(Demo)

    $array = [
        "page_title" => "contact us",
        "val" => [
            "pattern" => "/email/\s+us\s*(.*?)/\s/",
            "type" => "1"
        ]
    ];
    
    echo json_encode($array);
    

    输出:

    {"page_title":"contact us","val":{"pattern":"\/email\/\\s+us\\s*(.*?)\/\\s\/","type":"1"}}
    

    附言尽管模式将斜杠作为分隔符,但您的正则表达式模式在电子邮件之后和捕获组之后的那些未转义的斜杠看起来有问题。

    如果此模式用于 js 执行,您可能会获得更好的成功:

    email\/\s+us\s*(.*?)\/\s
    

    没有分隔符,以便正则表达式函数可以将您的模式用作变量。

    如果我上面的逻辑还不够响亮,这里有一个 javascript 演示,显示 json_encode() 不需要 addslashes()

    下面的data 变量将由以下内容填充:

    data = <?php echo json_encode([
                          "page_title" => "contact us",
                          "val" => [
                          "pattern" => "email\/\s+us\s*(.*?)\/\s",
                          "type" => "1"
                      ]
                      ]); ?>;
    

    let data = {"page_title":"contact us","val":{"pattern":"email\\\/\\s+us\\s*(.*?)\\\/\\s","type":"1"}},
        str = "You can email/ us all-day-long if you wish/  or not.";
    
    console.log(data.page_title);
    console.log(data.val.pattern);
    regex = new RegExp(data.val.pattern,"g");
    console.log(str.match(regex));
    console.log(data.val.type);

    【讨论】:

    • “我不知道为什么人们在不知情的情况下将其标记为负面?” ...@Martin 另一个答案被否决的原因可能是因为它没有t 解决您最初的单引号包装 json 字符串的问题。请仔细阅读我的回答。您不需要使用addslashes() 改变您的json 字符串。通过接受一种变通方法而不是一个干净的直接解决方案,您正在助长未来研究人员的错误信息。当单独 json_encode 完全有资格完成这项任务时,其他答案绝对没有优势。
    猜你喜欢
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多