一,什么是json
json是一种数据结构,易于人阅读和编写,同时也易于机器解析和生成。
json建构两种结构:
1,“名称/值”成对的集合,不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2,值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
json具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称 /值’ 对”之间使用“,”(逗号)分隔。
二,我遇到的问题
看下面的例子:
<?php $string = '{"skus" : [ { "SHADENAME" : null, "HEX_VALUE_STRING" : "", "SKU_BASE_ID" : 5912, "pricePlusTax" : 8400, "PRODUCT_SIZE" : "220g", "PRICE" : 8000, "SKU_ID" : "SKU5912", "INVENTORY_STATUS" : 2, "PRODUCT_CODE" : 016500 } ], "shaded" : 0, "PROD_CAT_IMAGE_NAME" : 0165, "SKINTYPE_DESC" : "", "PRODUCT_ID" : "PROD2158" } '; //下面的正则是把0615这样数据,转换成"0615" $pattern = "/:(\s*)0(\d+)/ui"; $replacement = ':\\1"0\\2"'; $string = preg_replace($pattern, $replacement, $string); $result = json_decode($string, true); print_r($result); $string = json_encode($result); echo $string; ?>
操作和分析:
1,如果我把正则的东西拿掉的话,print_r($result);根本显示不了任何东西,问题就出在016500这样的数据上,他搞不清楚,这样的数据到底是字符串类型,还是数值类型。加上双引号就好了。
2,我把数组又重新$string = json_encode($result);并把json字符串打印出来,发现在json_encode会把016500加上双引号,由此可以断定,php代码中的那段json字符串是手动生成的。
3,即使像016500这样的数据没有加上双引号,我想json_decode也可以做出准确的判断,因为这个逻辑不复杂,所以我想json_decode是不是应当改进一下,还有我用php版本是5.2.3,不知道最新的版本有没有修正这个bug
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/php/934.html
json也算是一门语言,JSON语法没有规定0开头是数字这一说,这不是PHP的BUG,是你自己的问题, 不要大惊小怪。
json是一种数据格式,不是什么语言。json不支持0开头的数字。
不是PHP 的bug,json是有类型的,
不用引号就默认作为number或者null处理了
你可以把这段json放到任何一个json验证的网站,都验证失败的
json.cn
bejson.com
tool.lu/json/
等等
前提是:你的json 是 valid json. 在你的json不是json的情况下,json_decode 出错,是正确的结果。
Results
Error: Parse error on line 11:
..., "PRODUCT_CODE": 016500 }], "shaded
----------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined'
https://jsonlint.com/