目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。
我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识。
从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。
一、json_encode()
该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:
<ol class="dp-c"> <li class="alt"><span><span class="vars">$arr</span><span> = </span><span class="keyword">array</span><span> (</span><span class="string">'a'</span><span>=>1,</span><span class="string">'b'</span><span>=>2,</span><span class="string">'c'</span><span>=>3,</span><span class="string">'d'</span><span>=>4,</span><span class="string">'e'</span><span>=>5); </span></span></li> <li> <span class="func">echo</span><span> json_encode(</span><span class="vars">$arr</span><span>); </span> </li> </ol>
结果为
<ol class="dp-c"><li class="alt"><span><span>{</span><span class="string">"a"</span><span>:1,</span><span class="string">"b"</span><span>:2,</span><span class="string">"c"</span><span>:3,</span><span class="string">"d"</span><span>:4,</span><span class="string">"e"</span><span>:5} </span></span></li></ol>
再看一个对象转换的例子:
<ol class="dp-c"> <li class="alt"><span><span class="vars">$obj</span><span>->body = </span><span class="string">'another post'</span><span>; </span></span></li> <li> <span class="vars">$obj</span><span>->id = 21; </span> </li> <li class="alt"> <span class="vars">$obj</span><span>->approved = true; </span> </li> <li> <span class="vars">$obj</span><span>->favorite_count = 1; </span> </li> <li class="alt"> <span class="vars">$obj</span><span>->status = NULL; </span> </li> <li> <span class="func">echo</span><span> json_encode(</span><span class="vars">$obj</span><span>); </span> </li> </ol>
结果为
<ol class="dp-c"> <li class="alt"><span><span>{ </span></span></li> <li> <span class="string">"body"</span><span>:</span><span class="string">"another post"</span><span>, </span> </li> <li class="alt"> <span class="string">"id"</span><span>:21, </span> </li> <li> <span class="string">"approved"</span><span>:true, </span> </li> <li class="alt"> <span class="string">"favorite_count"</span><span>:1, </span> </li> <li> <span class="string">"status"</span><span>:null </span> </li> <li class="alt"><span>} </span></li> </ol>
由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。
二、索引数组和关联数组
PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。
由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。
比如,现在有一个索引数组
<ol class="dp-c"> <li class="alt"><span><span class="vars">$arr</span><span> = Array(</span><span class="string">'one'</span><span>, </span><span class="string">'two'</span><span>, </span><span class="string">'three'</span><span>); </span></span></li> <li> <span class="func">echo</span><span> json_encode(</span><span class="vars">$arr</span><span>); </span> </li> </ol>
结果为:
<ol class="dp-c"><li class="alt"><span><span>[</span><span class="string">"one"</span><span>,</span><span class="string">"two"</span><span>,</span><span class="string">"three"</span><span>] </span></span></li></ol>
如果将它改为关联数组:
<ol class="dp-c"> <li class="alt"><span><span class="vars">$arr</span><span> = Array(</span><span class="string">'1'</span><span>=></span><span class="string">'one'</span><span>, </span><span class="string">'2'</span><span>=></span><span class="string">'two'</span><span>, </span><span class="string">'3'</span><span>=></span><span class="string">'three'</span><span>); </span></span></li> <li> <span class="func">echo</span><span> json_encode(</span><span class="vars">$arr</span><span>); </span> </li> </ol>
结果就变了:
<ol class="dp-c"><li class="alt"><span><span>{</span><span class="string">"1"</span><span>:</span><span class="string">"one"</span><span>,</span><span class="string">"2"</span><span>:</span><span class="string">"two"</span><span>,</span><span class="string">"3"</span><span>:</span><span class="string">"three"</span><span>} </span></span></li></ol>
注意,数据格式从"[]"(数组)变成了"{}"(对象)。
如果你需要将"索引数组"强制转化成"对象",可以这样写
<ol class="dp-c"><li class="alt"><span><span>json_encode( (object)</span><span class="vars">$arr</span><span> ); </span></span></li></ol>
或者
<ol class="dp-c"><li class="alt"><span><span>json_encode ( </span><span class="vars">$arr</span><span>, JSON_FORCE_OBJECT ); </span></span></li></ol>
三、类(class)的转换
下面是一个PHP的类:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">class</span><span> Foo { </span></span></li> <li> <span class="keyword">const</span><span> ERROR_CODE = </span><span class="string">'404'</span><span>; </span> </li> <li class="alt"> <span class="keyword">public</span><span> </span><span class="vars">$public_ex</span><span> = </span><span class="string">'this is public'</span><span>; </span> </li> <li> <span class="keyword">private</span><span> </span><span class="vars">$private_ex</span><span> = </span><span class="string">'this is private!'</span><span>; </span> </li> <li class="alt"> <span class="keyword">protected</span><span> </span><span class="vars">$protected_ex</span><span> = </span><span class="string">'this should be protected'</span><span>; </span> </li> <li> <span class="keyword">public</span><span> </span><span class="keyword">function</span><span> getErrorCode() { </span> </li> <li class="alt"> <span class="keyword">return</span><span> self::ERROR_CODE; </span> </li> <li><span>} </span></li> <li class="alt"><span>} </span></li> </ol>
现在,对这个类的实例进行json转换:
<ol class="dp-c"> <li class="alt"><span><span class="vars">$foo</span><span> = </span><span class="keyword">new</span><span> Foo; </span></span></li> <li> <span class="vars">$foo_json</span><span> = json_encode(</span><span class="vars">$foo</span><span>); </span> </li> <li class="alt"> <span class="func">echo</span><span> </span><span class="vars">$foo_json</span><span>; </span> </li> </ol>
输出结果是
<ol class="dp-c"><li class="alt"><span><span>{</span><span class="string">"public_ex"</span><span>:</span><span class="string">"this is public"</span><span>} </span></span></li></ol>
可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。
四、json_decode()
该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:
<ol class="dp-c"> <li class="alt"><span><span class="vars">$json</span><span> = </span><span class="string">'{"foo": 12345}'</span><span>; </span></span></li> <li> <span class="vars">$obj</span><span> = json_decode(</span><span class="vars">$json</span><span>); </span> </li> <li class="alt"> <span>print </span><span class="vars">$obj</span><span>->{</span><span class="string">'foo'</span><span>}; </span><span class="comment">// 12345</span><span> </span> </li> </ol>
通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:
<ol class="dp-c"> <li class="alt"><span><span class="vars">$json</span><span> = </span><span class="string">'{"a":1,"b":2,"c":3,"d":4,"e":5}'</span><span>; </span></span></li> <li> <span>var_dump(json_decode(</span><span class="vars">$json</span><span>)); </span> </li> </ol>
结果就是生成一个PHP对象:
<ol class="dp-c"> <li class="alt"><span><span>object(stdClass)#1 (5) { </span></span></li> <li> <span>[</span><span class="string">"a"</span><span>] => int(1) </span> </li> <li class="alt"> <span>[</span><span class="string">"b"</span><span>] => int(2) </span> </li> <li> <span>[</span><span class="string">"c"</span><span>] => int(3) </span> </li> <li class="alt"> <span>[</span><span class="string">"d"</span><span>] => int(4) </span> </li> <li> <span>[</span><span class="string">"e"</span><span>] => int(5) </span> </li> <li class="alt"><span>} </span></li> </ol>
如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:
<ol class="dp-c"> <li class="alt"><span><span class="vars">$json</span><span> = </span><span class="string">'{"a":1,"b":2,"c":3,"d":4,"e":5}'</span><span>; </span></span></li> <li> <span>var_dump(json_decode(</span><span class="vars">$json</span><span>),true); </span> </li> </ol>
结果就生成了一个关联数组:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">array</span><span>(5) { </span></span></li> <li> <span>[</span><span class="string">"a"</span><span>] => int(1) </span> </li> <li class="alt"> <span>[</span><span class="string">"b"</span><span>] => int(2) </span> </li> <li> <span>[</span><span class="string">"c"</span><span>] => int(3) </span> </li> <li class="alt"> <span>[</span><span class="string">"d"</span><span>] => int(4) </span> </li> <li> <span>[</span><span class="string">"e"</span><span>] => int(5) </span> </li> <li class="alt"><span>} </span></li> </ol>
五、json_decode()的常见错误
下面三种json写法都是错的,你能看出错在哪里吗?
<ol class="dp-c"> <li class="alt"><span><span class="vars">$bad_json</span><span> = </span><span class="string">"{ 'bar': 'baz' }"</span><span>; </span></span></li> <li> <span class="vars">$bad_json</span><span> = </span><span class="string">'{ bar: "baz" }'</span><span>; </span> </li> <li class="alt"> <span class="vars">$bad_json</span><span> = </span><span class="string">'{ "bar": "baz", }'</span><span>; </span> </li> </ol>
对这三个字符串执行json_decode()都将返回null,并且报错。
第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的"名"(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。
另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。
<ol class="dp-c"><li class="alt"><span><span>var_dump(json_decode(</span><span class="string">"Hello World"</span><span>)); </span><span class="comment">//null</span><span> </span></span></li></ol>
六、参考材料
* PHP Manual (http://php.net/manual/en/book.json.php)
* Ed Finkler, JSON is Everybody's Friend (http://phpadvent.org/2008/json-is-everybodys-friend-by-ed-finkler)
原文地址:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP可以輕鬆創建互動網頁內容。 1)通過嵌入HTML動態生成內容,根據用戶輸入或數據庫數據實時展示。 2)處理表單提交並生成動態輸出,確保使用htmlspecialchars防XSS。 3)結合MySQL創建用戶註冊系統,使用password_hash和預處理語句增強安全性。掌握這些技巧將提升Web開發效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Dreamweaver Mac版
視覺化網頁開發工具

Dreamweaver CS6
視覺化網頁開發工具