json_decode()不适用于此有效的JSON字符串 [英] json_decode() does not work with this valid JSON string

查看:283
本文介绍了json_decode()不适用于此有效的JSON字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的应用程序从Postmark接收的JSON字符串,一个入站电子邮件传送服务:

  {
从:me@mydomain.com,
FromFull:{
电子邮件:me@mydomain.com,
名称:杰克
},
To:\test@email.mydomain.com\< test@email.mydomain.com>,
ToFull:[
{
电子邮件:test@email.mydomain.com,
名称:test@email.mydomain.com
}
],
Cc:,
CcFull:[],
ReplyTo:,
主题:Brussel Sprouts,
MessageID :a97fb074-338e-48c5-97db-d9c5155e9307,
Date:Sun,2012年12月30日18:10:54 +0000,
MailboxHash:,
TextBody:Are Nice,
HtmlBody:,
Tag:,
标题:[
{
名称:X-Spam-Checker-Version,
Value:SpamAssassin 3.3.1(2010-03-16)onrs-iad-pm-inbound1.wildbit.com
},
{
名称:X-Spam-S t $
价值:否
},
{
名称:X-Spam-Score,
价值 0.0
},
{
名称:X-Spam-Tests,
值:RCVD_IN_DNSWL_BLOCKED
},
{
Name:Received-SPF,
Value:None(no SPF record)identity = mailfrom;客户IP = 209.85.212.175; HELO = mail-wi0-f175.google.com; envelope-from=me@mydomain.com; receiver = test@email.mydomain.com.com
},
{
名称:X-Google-DKIM签名,
价值: v = 1; A = RSA-SHA256; C = relaxed\ /松弛; D = google.com; S = 20120113; h = x-received:from:content-type:content-transfer-encoding:subject:message-id:date:to:mime-version:x-mailer:x-gm-message-state; BH = JrLpPQqTnp0QixED2qZ5 + zepXQXuPLJWqihFECt8uJ4 =; B = EJHac6BaGi3laxnMZZ3Lf\ / ervtavKTG0 + DHXRRCfGH2HSG42wN\ / qIj6IQ0G36NFsjT x2tnYRhj7aBRseky + YEyAF99kUOx\ / p8qaCWo7wN1cf3dTJUrrQu\ / vrdgdXezfheKW49z x4\ / d\ / 8f2bgJN5MvTtZj15WmqZRCDt8\ / QJVZvP7J5hANdxqULgwAJCaCJFU3CTNu66nT + M1tPSDfZwTdNsS70Pna75Y3bRtlJPxXF6gesYhXK\ / cnDbqsCopcAiEc9guMVMnqAjIRu XqBWLft4Bom5H2ViNj5V\ / A3GCmP44h\ / OM1h + h2zBTYJ3fJK4zyluok8K5GIjn9KN1o2w v4eA ==
},
{
名称:X接收,
值:由10.180.72.146与SMTP id d18mr51711599wiv。 33.1356891056971;太阳,2012年12月30日10:10:56 -0800(PST)
},
{
名称:内容转移编码,
:7bit
},
{
Name:Message-Id,
Value:< 224B85F9-B9C2-4273-A81C-7C340E8A66B2 @ mydomain.com>
},
{
名称:Mime版本,
值:1.0(Mac OS X Mail 6.2 \\ (1499\\))
},
{
名称:X-Mailer,
值:苹果邮件(2.1499)
},
{
Name:X-Gm-Message-State,
Value:ALoCoQl0eQmrBNRNbe7T06oTeDXcEA3LDLJurR2U0Yj64EyOA2Iy3YL6CyiTodGXtuJHIuMlm5a1
}
]
附件:[]
}

将其复制到任何JSON验证器但是,当我在这个字符串上运行 json_decode(); 时,在PHP中,它会静默地失败,当运行 echo json_last_error(); 返回的错误代码是 4 。这对应于语法错误。



通过简单地将 \ 找到 \\我的代码编辑器中的\\\ ,我可以让它工作,但是如何让PHP自动执行此操作?



编辑:如在注释中发现的,上面发布的确切的字符串在从文件读入时可以正常工作,因为PHP不会尝试解析任何反斜杠等。但是,在读取时它似乎正在解析斜杠in file_get_contents('php:// input)这是什么现在导致我的问题。

解决方案

您可以在变量上执行此操作:

  $ json = str_replace('\\ ','\\\\\',$ json); 


Here is the JSON string my app is receiving from Postmark, an inbound email delivery service:

{
  "From": "me@mydomain.com",
  "FromFull": {
    "Email": "me@mydomain.com",
    "Name": "Jack"
  },
  "To": "\"test@email.mydomain.com\" <test@email.mydomain.com>",
  "ToFull": [
    {
      "Email": "test@email.mydomain.com",
      "Name": "test@email.mydomain.com"
    }
  ],
  "Cc": "",
  "CcFull": [],
  "ReplyTo": "",
  "Subject": "Brussel Sprouts",
  "MessageID": "a97fb074-338e-48c5-97db-d9c5155e9307",
  "Date": "Sun, 30 Dec 2012 18:10:54 +0000",
  "MailboxHash": "",
  "TextBody": "Are Nice",
  "HtmlBody": "",
  "Tag": "",
  "Headers": [
    {
      "Name": "X-Spam-Checker-Version",
      "Value": "SpamAssassin 3.3.1 (2010-03-16) onrs-iad-pm-inbound1.wildbit.com"
    },
    {
      "Name": "X-Spam-Status",
      "Value": "No"
    },
    {
      "Name": "X-Spam-Score",
      "Value": "0.0"
    },
    {
      "Name": "X-Spam-Tests",
      "Value": "RCVD_IN_DNSWL_BLOCKED"
    },
    {
      "Name": "Received-SPF",
      "Value": "None (no SPF record) identity=mailfrom; client-ip=209.85.212.175; helo=mail-wi0-f175.google.com; envelope-from=me@mydomain.com; receiver=test@email.mydomain.com.com"
    },
    {
      "Name": "X-Google-DKIM-Signature",
      "Value": "v=1; a=rsa-sha256; c=relaxed\/relaxed;        d=google.com; s=20120113;        h=x-received:from:content-type:content-transfer-encoding:subject         :message-id:date:to:mime-version:x-mailer:x-gm-message-state;        bh=JrLpPQqTnp0QixED2qZ5+zepXQXuPLJWqihFECt8uJ4=;        b=EJHac6BaGi3laxnMZZ3Lf\/ervtavKTG0+DHXRRCfGH2HSG42wN\/qIj6IQ0G36NFsjT         x2tnYRhj7aBRseky+YEyAF99kUOx\/p8qaCWo7wN1cf3dTJUrrQu\/vrdgdXezfheKW49z         x4\/d\/8f2bgJN5MvTtZj15WmqZRCDt8\/QJVZvP7J5hANdxqULgwAJCaCJFU3CTNu66nT+         M1tPSDfZwTdNsS70Pna75Y3bRtlJPxXF6gesYhXK\/cnDbqsCopcAiEc9guMVMnqAjIRu         XqBWLft4Bom5H2ViNj5V\/A3GCmP44h\/OM1h+h2zBTYJ3fJK4zyluok8K5GIjn9KN1o2w         v4eA=="
    },
    {
      "Name": "X-Received",
      "Value": "by 10.180.72.146 with SMTP id d18mr51711599wiv.33.1356891056971;        Sun, 30 Dec 2012 10:10:56 -0800 (PST)"
    },
    {
      "Name": "Content-Transfer-Encoding",
      "Value": "7bit"
    },
    {
      "Name": "Message-Id",
      "Value": "<224B85F9-B9C2-4273-A81C-7C340E8A66B2@mydomain.com>"
    },
    {
      "Name": "Mime-Version",
      "Value": "1.0 (Mac OS X Mail 6.2 \\(1499\\))"
    },
    {
      "Name": "X-Mailer",
      "Value": "Apple Mail (2.1499)"
    },
    {
      "Name": "X-Gm-Message-State",
      "Value": "ALoCoQl0eQmrBNRNbe7T06oTeDXcEA3LDLJurR2U0Yj64EyOA2Iy3YL6CyiTodGXtuJHIuMlm5a1"
    }
  ],
  "Attachments": []
}

Copy that into any JSON Validator and you'll see that it is valid.

However, when I run json_decode(); on this string in PHP, it fails silently. When running echo json_last_error(); the returned error code is 4. This corresponds to a Syntax Error.

By simply find-replacing \ to \\ in my code editor, I can get this to work, but how can I get PHP to automatically do this?

EDIT: As discovered in the comments, the exact string I posted above works correctly when read in from a file, as PHP does not try to parse any backslashes etc. However, it appears to be parsing the slashes when read in from file_get_contents('php://input) which is what is now causing me problems.

解决方案

You could do this on the variable:

$json = str_replace('\\', '\\\\', $json);

这篇关于json_decode()不适用于此有效的JSON字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆