我有一个cURL请求给服务器,它返回这个jsonp类型的数据,但是我不知道为什么parsing解析这个JSON时什么都不返回。这就是我得到的请求:
{
"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不能解析这个呢?
$jsonData = '{
"data": {
"name": "Color Collections",
"category": "collection",
},
"error": "",
"countryCode": "en-us",
"brand": "BenjaminMoore,Corotech,Coronado,Inslx,Lenmar,Maxum"
}';
print_r( json_decode($jsonData, true));发布于 2021-06-19 22:18:22
这两个都不是有效的JSON。您可以始终在像林特这样的林子中运行JSON,以确保它是有效的。
较小的示例在第4行中有一个额外的逗号:
{
"data": {
"name": "Color Collections",
"category": "collection", //<-------------here
},
"error": "",
"countryCode": "en-us",
"brand": "BenjaminMoore,Corotech,Coronado,Inslx,Lenmar,Maxum"
}你的大号在第24行有一个额外的逗号。
{
"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"
}发布于 2021-06-26 16:21:01
为什么PHP不能解析这个json_decode
$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类型的第一个参数。值
true、false和null分别以true、false和null的形式返回。如果对第一个参数的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()来抛出错误:
$result = json_decode($jsonData, true, 512, JSON_THROW_ON_ERROR);这突出了解码,字符编码和限制命中等直接可见,并委托到标准的错误处理过程,以便您可以编写您的代码自上而下。
很好,谢谢所有的鱼,一切都很好,很好,但现在,我知道有一个错误,但仍然是不工作的情况是相同的,所以为什么快照是无效的JSON?
如果这仍然让您感到困惑,或者可能是前面的第一个问题(而不是问题中所写的PHP或json_decode ),那么答案就更简单了:您需要使用一个工具来告诉您为什么会破坏该JSON。
这可以是语法突出显示,但更有可能的是,您希望使用验证器来显示实际错误。
例如,在IDE中(此处为PhpStorm):

这里是红色的波浪划线。

同样,答案是语法错误,这里暗示
JSON标准不允许尾随逗号。
现在还有什么要说的吗?如果您在json_decode中看到一个错误,而您看不到JSON被破坏了,那么首先验证它。仅仅通过查看JSON文本,JSON编码错误就很容易被忽略。而且往往不值得。无效的JSON?放下。然后结束了。
激活JSON_THROW_ON_ERROR,您的代码就可以保持不变,现在包括电池。
https://stackoverflow.com/questions/68051139
复制相似问题