首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PHP不能解析这个json_decode

为什么PHP不能解析这个json_decode
EN

Stack Overflow用户
提问于 2021-06-19 22:13:28
回答 2查看 153关注 0票数 0

我有一个cURL请求给服务器,它返回这个jsonp类型的数据,但是我不知道为什么parsing解析这个JSON时什么都不返回。这就是我得到的请求:

代码语言:javascript
复制
{
  "data": {
    "name": "Color Collections",
    "category": "collection",
    "palettes": [
      {
        "name": "America's Colors",
        "category": "collection",
        "colors": [
          {
            "number": "AC-1",
            "name": "Coastal Fog",
            "family": "Neutral",
            "url": "http://www.benjaminmoore.com/en-us/paint-color/ac-1?apiKey=9471009bd36bd062c688",
            "shortURL": "/ac-1",
            "hex": "CAC4B0",
            "r": 202,
            "g": 196,
            "b": 176,
            "exteriorAvailability": "available",
            "wetSampleSKU": null,
            "drySampleSKU": null,
            "eStoreAvailable": false,
            "productTypesAvailable": "paint",
            "stainOpacitiesAvailable": null
          },
          
        ],
        "colorList": [
          "AC-1",
          "AC-2",
          "AC-3",
          "AC-4",
          "AC-5",
          "AC-6",
          "AC-7",
          "AC-8",
          "AC-9",
          "AC-10",
          "AC-11",
          "AC-12",
          "AC-13",
          "AC-14",
          "AC-15",
          "AC-16",
          "AC-17",
          "AC-18",
          "AC-19",
          "AC-20",
          "AC-21",
          "AC-22",
          "AC-23",
          "AC-24",
          "AC-25",
          "AC-26",
          "AC-27",
          "AC-28",
          "AC-29",
          "AC-30",
          "AC-31",
          "AC-32",
          "AC-33",
          "AC-34",
          "AC-35",
          "AC-36",
          "AC-37",
          "AC-38",
          "AC-39",
          "AC-40",
          "AC-41",
          "AC-42"
        ],
        "code": "AC",
        "description": "42 soft hues inspired by the pale gray of our beautiful coastlines to the rich earth tones of our Southwestern deserts. ",
        "url": "http://www.benjaminmoore.com/en-us/for-your-home/color-gallery?apiKey=9471009bd36bd062c688#&ce_vm=2&ce_col=AC?apiKey=9471009bd36bd062c688",
        "rows": 7,
        "totalColors": 42,
        "eStoreProductCode": null
      },
    ]
  },
  "error": "",
  "countryCode": "en-us",
  "brand": "BenjaminMoore,Corotech,Coronado,Inslx,Lenmar,Maxum"
}

但是,即使是我也删除了一些部件,使其工作起来很短,但仍然没有从PHP中返回。这是我的代码,看看,告诉我这里发生了什么?为什么PHP不能解析这个呢?

代码语言:javascript
复制
 $jsonData = '{
    "data": {
      "name": "Color Collections",
      "category": "collection",
    },
    "error": "",
    "countryCode": "en-us",
    "brand": "BenjaminMoore,Corotech,Coronado,Inslx,Lenmar,Maxum"
  }';
  print_r( json_decode($jsonData, true));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-19 22:18:22

这两个都不是有效的JSON。您可以始终在像林特这样的林子中运行JSON,以确保它是有效的。

较小的示例在第4行中有一个额外的逗号:

代码语言:javascript
复制
  {
    "data": {
      "name": "Color Collections",
      "category": "collection", //<-------------here
    },
    "error": "",
    "countryCode": "en-us",
    "brand": "BenjaminMoore,Corotech,Coronado,Inslx,Lenmar,Maxum"
  }

你的大号在第24行有一个额外的逗号。

代码语言:javascript
复制
{
  "data": {
    "name": "Color Collections",
    "category": "collection",
    "palettes": [
      {
        "name": "America's Colors",
        "category": "collection",
        "colors": [
          {
            "number": "AC-1",
            "name": "Coastal Fog",
            "family": "Neutral",
            "url": "http://www.benjaminmoore.com/en-us/paint-color/ac-1?apiKey=9471009bd36bd062c688",
            "shortURL": "/ac-1",
            "hex": "CAC4B0",
            "r": 202,
            "g": 196,
            "b": 176,
            "exteriorAvailability": "available",
            "wetSampleSKU": null,
            "drySampleSKU": null,
            "eStoreAvailable": false,
            "productTypesAvailable": "paint",
            "stainOpacitiesAvailable": null
          }, //<------------------------------------- here
          
        ],
        "colorList": [
          "AC-1",
          "AC-2",
          "AC-3",
          "AC-4",
          "AC-5",
          "AC-6",
          "AC-7",
          "AC-8",
          "AC-9",
          "AC-10",
          "AC-11",
          "AC-12",
          "AC-13",
          "AC-14",
          "AC-15",
          "AC-16",
          "AC-17",
          "AC-18",
          "AC-19",
          "AC-20",
          "AC-21",
          "AC-22",
          "AC-23",
          "AC-24",
          "AC-25",
          "AC-26",
          "AC-27",
          "AC-28",
          "AC-29",
          "AC-30",
          "AC-31",
          "AC-32",
          "AC-33",
          "AC-34",
          "AC-35",
          "AC-36",
          "AC-37",
          "AC-38",
          "AC-39",
          "AC-40",
          "AC-41",
          "AC-42"
        ],
        "code": "AC",
        "description": "42 soft hues inspired by the pale gray of our beautiful coastlines to the rich earth tones of our Southwestern deserts. ",
        "url": "http://www.benjaminmoore.com/en-us/for-your-home/color-gallery?apiKey=9471009bd36bd062c688#&ce_vm=2&ce_col=AC?apiKey=9471009bd36bd062c688",
        "rows": 7,
        "totalColors": 42,
        "eStoreProductCode": null
      },
    ]
  },
  "error": "",
  "countryCode": "en-us",
  "brand": "BenjaminMoore,Corotech,Coronado,Inslx,Lenmar,Maxum"
}
票数 2
EN

Stack Overflow用户

发布于 2021-06-26 16:21:01

为什么PHP不能解析这个json_decode

代码语言:javascript
复制
 $jsonData = '{
    "data": {
      "name": "Color Collections",
      "category": "collection",
    },
    "error": "",
    "countryCode": "en-us",
    "brand": "BenjaminMoore,Corotech,Coronado,Inslx,Lenmar,Maxum"
  }';
  print_r( json_decode($jsonData, true));

这是我的代码,看看,告诉我这里发生了什么?为什么PHP不能解析这个呢?

PHP可以很好地解析这个PHP代码。而json_decode也做了标准操作,让我们看看这是怎么回事。

首先是关于json_decode在示例中返回的内容的基础知识:NULL

有意思的!

为什么这个NULL返回值有趣?

首先,显然乍一看,它不是字符串中的JSON文本,或者是吗?

第二,NULL已记录在案返回值,它可以(但不能)指示解析JSON文本的错误。

以下是PHP手册的摘录:

返回值 返回在json引用中编码的值,该值指向适当的PHP类型的第一个参数。值truefalsenull分别以truefalsenull的形式返回。如果对第一个参数的json引用无法解码,或者编码的数据深度超过嵌套限制,则返回null

由于JSON文本不是"null",因此将NULL视为返回类型信号已经出现了一个问题:

也许json_decode检测到无效输入并拒绝对其进行操作?还是达到了嵌套极限(深度,第三个参数)?还是字符串没有被编码?

关于问题的问题,如何学到更多?

在您的例子中,您可以通过json_last_error()json_last_error_msg()函数找到它。因此,让我们看看这些函数返回的代码:错误代码的int(4)和错误消息的string(12) "Syntax error"

哦,在传递给json_decode()的JSON文本中有一个语法错误。这意味着不存在嵌套限制或字符编码问题!

让我们重新措辞:

为什么PHP不能解析这个json_decode

因为那个JSON有语法错误。

好吧,这看起来很尴尬,对不对?但是等等,什么是PHP的json_decode()的JSON呢?那么,看一看手册又是强制性的:

PHP实现了原始RFC 7159中指定的JSON超集。

所以(更多)正确的答案是:

因为JSON文本不是RFC 7159 JavaScript对象表示法(JSON)数据交换格式。

这是给老板留下深刻印象的声明!

既然这个答案已经过时了,接下来的问题是:如何处理它?那么,检查返回类型和错误函数,或者-使用适当的标志来调用当前推荐的json_decode()来抛出错误:

代码语言:javascript
复制
$result = json_decode($jsonData, true, 512, JSON_THROW_ON_ERROR);

这突出了解码,字符编码和限制命中等直接可见,并委托到标准的错误处理过程,以便您可以编写您的代码自上而下。

很好,谢谢所有的鱼,一切都很好,很好,但现在,我知道有一个错误,但仍然是不工作的情况是相同的,所以为什么快照是无效的JSON?

如果这仍然让您感到困惑,或者可能是前面的第一个问题(而不是问题中所写的PHP或json_decode ),那么答案就更简单了:您需要使用一个工具来告诉您为什么会破坏该JSON。

这可以是语法突出显示,但更有可能的是,您希望使用验证器来显示实际错误。

例如,在IDE中(此处为PhpStorm):

  1. 将字符串的内容标记为JSON,例如使用PHPDoc:$jsonData = /** @lang */ { "data":{.
  2. 查找IDE突出显示的JSON文本字符串中的任何错误(取决于您使用的产品可能有所不同):

这里是红色的波浪划线。

  1. 激活它的错误信息以获取更多信息(例如,用鼠标将其悬停并等待工具提示出现):

同样,答案是语法错误,这里暗示

JSON标准不允许尾随逗号。

现在还有什么要说的吗?如果您在json_decode中看到一个错误,而您看不到JSON被破坏了,那么首先验证它。仅仅通过查看JSON文本,JSON编码错误就很容易被忽略。而且往往不值得。无效的JSON?放下。然后结束了。

激活JSON_THROW_ON_ERROR,您的代码就可以保持不变,现在包括电池。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68051139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档