無意中發現php的json decode有bug

2022-08-17 14:27:17 字數 1423 閱讀 7914

一,什麼是json

json是一種資料結構,易於人閱讀和編寫,同時也易於機器解析和生成。

json建構兩種結構:

1,「名稱/值」成對的集合,不同的語言中,它被理解為物件(object),紀錄(record),結構(struct),字典(dictionary),雜湊表(hash table),有鍵列表(keyed list),或者關聯陣列 (associative array)。

2,值的有序列表(an ordered list of values)。在大部分語言中,它被理解為陣列(array)。

json具有以下這些形式:

物件是乙個無序的「『名稱/值』對」集合。乙個物件以「」(右括號)結束。每個「名稱」後跟乙個「:」(冒號);「『名稱 /值』 對」之間使用「,」(逗號)分隔

二,我遇到的問題

看下面的例子:

檢視複製列印?

<?php  

$string = ' 

], "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

參考:

無意中發現的WIN7的BUG

於是猜測,這可能是win7的桌面對ico圖示檔案會建立乙個索引或者有快取,那麼我要是把桌面重新啟動呢,會不會就可以重新整理過來?想不如做,立即試試。顯示桌面的程式是explorer.exe,於是開啟任務管理器,將其強制結束掉。之後,點任務管理器裡的檔案 新建任務 輸入explorer.exe 回車,...

無意中的StackOverflowError

created by ouer1994 on 16 11 25.public class list 1 static class m override public string tostring 我認為產生此錯誤的原因是遞迴呼叫tostring 方法。return this name name 這...

無意中發現一位大佬的演算法刷題pdf筆記

昨晚逛github,無意中看到一位大佬 的演算法刷題筆記,感覺發現了寶藏!有些小夥伴可能已經發現了,但咱這裡還是忍不住安利一波,怕有些小夥伴沒有看到。關於演算法刷題的困惑和疑問也經常聽朋友們提及。這份筆記裡面共包含作者刷leetcode演算法題後整理的數百道題,每道題均附有詳細題解過程。很多人表示刷...