深入理解JSON在PHP中的应用
一直都认为JSON很简单,自己完全掌握了,今天才知道,自己只是“好像”掌握了,真正用起来连格式都记不住。
群里的@TP新人(其实他是老人,不是什么新人,装纯的。。。:))今天问了个问题,引起了我的兴趣,并让我真正了解了JSON。
一、什么是JSON
先看看什么是JSON,可以在http://www.json.org/json-zh.html/详细查看,当然也可以看看阮一峰的博客,有一篇介绍数据类型和JSON格式:http://www.ruanyifeng.com/blog/2009/05/data\_types\_and\_json.html。
1、对象
对象是一个无序的“‘名称/值'对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值' 对”之间使用“,”(逗号)分隔。
也即,对象格式必须是如下形式:
{"foo":"bar", "hello":{"roy":"gu"}}
2、数组
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
也即,数组格式必须是如下形式:
[["a", "b"],["c", "d"], "e"]
3、什么是值(Value)和字符串(String)?
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。
现在应该对JSON有一定的了解了吧,:)?虽然JSON格式的组成原子很简单,但其复杂的嵌套足以让你头疼。
二、PHP对JSON的支持
目前只有三个函数:
json_decode() - decode from json format json_encode() - encode to json format json_last_error() - Returns the last error occurred
有人说PHP对JSON字符串要求很苛刻,其实不然,JSON格式的定义已经很明确了:不管是value还是string都必须用双引号,等等。
那么昨天@TP新人的问题是:要用PHP处理这种字符:[{a:'a1',b:'b1'},{a:'a2',b:'b2'}],咋一看以为是JSON字符串,其实不然,值不能用单引号引用,名称两边必须用双引号。如果是规范的那么应该是这样子:[{"a":"a1","b":"b1"},{"a":"a2","b":"b2"}],这是一个具有两个元素的数组,每个元素都是一个对象,且每个对象中都包含有两对名称/值。如果要使用PHP的json\_decode函数,就必须把它转换成标准JSON字符串格式。这个时候我当然想到正则了哈,下面是我写的处理代码:
<?php // raw string $j = "[{a:'a1',b:'b1'},{a:'a2',b:'b2'}]"; // strip [ and ] on both boundary ... $j = trim($j, '[]'); // process the string with regex $j = preg_replace('#\b([^\'\",]+?):\'([^,]*)\'#', '"$1":"$2"', $j); // ... then add [ and ] again $j = "[".$j."]"; // print json stirng with standard format echo $j . "\n"; // decode it and dump the result $a = json_decode($j, true); var_dump($a);
@TP新人 根据自己的需求重写了下:
<?php $j = "[{a:a1,b:'b1'},{a:'a2',b:b2}]"; $j = trim($j, '[]'); $j = preg_replace_callback('#\b([^\'\",]+?):([^,\}]*)#', 't', $j); $j = "[".$j."]"; echo $j."\n"; $a = json_decode($j); var_dump($a); function t($m) { $m[1]='"'.$m[1].'"'; $m[2]=trim($m[2],"'"); $m[2]='"'.trim($m[2],'"').'"'; return $m[1].':'.$m[2]; }
问题解决,收工!!!!