起步 - JSON

  • 作者:KK

  • 发表日期:2016.4.4


JSON是一个字符串,但它有一种排列规律,这个字符串排列格式通常用于数据传输

比如{"name":"Jay"}这样一个字符串就是JSON,它表示了一个数据,这个数据里有一个名字,名字叫Jay,name是数据的名称(或者标识),说明了这是个什么数据,然后用:号隔开,右边就是数据的值了,实际上这个冒号与名称/值之间加多几个空格都无所谓,比如{"name" : "Jay"},为了方便查看,一般都加1个空格隔开

其中,JSON字符串的左右两边一般总是被花括号或者方括号包住的,比如{..json的内容..}或者[..json的内容..]


将JSON转换成数组

$json = '{"name" : "Jay"}'; //注意,无论写什么内容,这个东西到头来还只是一个字符串而已
$data = json_decode($json, true); //使用这个函数将json转换成PHP数组,第2个参数注意加true
echo $data['name']; //Jay

通过json_decode将一个JSON字符串进行解码后会得到一个PHP数组,而通常都是关联数组

其实JSON格式的字符串并不是PHP专用的,很多编程语言都能解析这种解析,比如JS也可以,其它就不列举了,只是在这个教程里,以PHP为例子演示一下


属性

一个JSON字符串可以表示很多数据,比如要表示姓名,年龄,金钱等等,那我们要取这些数据,从逻辑上讲就需要类似这样的代码

json.姓名
json.年龄
json.金钱

我们要通过这些标记来取得姓名,年龄和金钱,这就是JSON的属性了,比如{"name" : "Jay"}这个JSON,name就是它的属性,Jay就是name这个属性的属性值

属性名称是一个字符串,必须用双引号引住,属性值有几种,下面再讲解

如果有多个属性的话,在书写新的属性之前,先在前一个属性值的后面加一个逗号,再开始写,比如这样:{"name" : "Jay", "age" : 18},这样就表示了一个带有name属性和age属性的JSON,age的属性值就是18

多行书写

其实JSON还支持多行编写的,比如这样:

{
	"name" : "Jay",
	"age" : 18
}

试一试:

$json = '
{
	"name" : "Jay",
	"age" : 18
}';
$data = json_decode($json, true);
echo $data['age'];

属性值

  • 表示数字和字符串

    表示字符串的话就是上面例子的样子,用引号引住就行,如果要表示数字就不用引号了,比如{"age" : 18}

  • 表示对象

    在JSON中有一种值叫对象,而对象又有属性,这种值要用花括号包住,但这个花括号不用双引号包住,只是花括号里面的属性名称和字符串的值需要花括号包住,比如这样:

    {
    	"name" : "XX学校",
    	"address" : {
    		"province" : "广东省",
    		"city" : "深圳市",
    		"xxx" : "()..."
    	},
    	"student_info" : {"nums":3355}
    }
    

    address这个属性的值就是对象,表达了一个地址信息,这个对象中有province(省份)和city(城市)

    而student_info的值也是一个对象,对象里有个nums属性,我用来表示学生数量,

    啊咦你想起些什么了吗!?----没错!这个对象的写法和JS的一模一样!

    其实整个JSON的写法看下来都和JS的都一样

    对象值在PHP里也当作关联数组一样一层层往下访问,这样:

    $json = '
    {
    	"name" : "XX学校",
    	"address" : {
    		"province" : "广东省",
    		"city" : "深圳市",
    		"xxx" : "()..."
    	},
    	"student_info" : {"nums":3355}
    }';
    $data = json_decode($json, true);
    echo $data['address']['city'];
    echo $data['student_info']['nums'];
    
    

    好了后面的例子我不再这样演示了,自己json_decode后看看print_r($data)的结果吧

  • 表示数组

    比如表示一个属性里有很多个名字:

    {
    	"members" : ["小明", "小红", "小东"]
    }
    

    这里members属性的值就是一个数组,数组使用方括号包住,里面的元素有3个,都是字符串,用逗号隔开

  • 探讨最外层

    上面例子中,所有演示的JSON都是被花括号包住的,其实就这样一个JSON:{"name":"Marie"}虽然它只有一个name属性,但这个JSON也是一个对象,这个对象就有一个name属性

    而这最外层其实也可以用方括号包住,这一点我在最开头已经提到过,就这样:["小明","小红","小东"]这个字符串都是属于JSON格式的,代表了一个数组


将PHP数组转换成JSON

这个可简单极了,只要用json_encode函数就可以

$data = ['name' => 'Jay'];
$json = json_encode($data);
echo $json;

结果就会输出

{"name":"Jay"}

再来一个

$data = [
	'name' => 'Jay',
	'birthday' => [
		'year' => 2012,
		'month' => 12,
		'day' => 12,
	],
	childrens => [
		[
			'name' => 'xiao ming',
			'age' => 17,
		],
		[
			'name' => 'xiao hong',
			'age' => 15,
		],
	],
];
$json = json_encode($data);
echo $json;

结果就是输出

{"name":"Jay","birthday":{"year":2012,"month":12,"day":12},"childrens":[{"name":"xiao ming","age":17},{"name":"xiao hong","age":15}]}

用json_encode函数编码出来的json字符串都是压缩型的,不会有换行,也不会有多余的空格,除非字符串里面有空格


美化JSON排版

如果你的同事像上面用json_encode函数编码出来的一个JSON字符串发送给你,你有时候真看不懂它表达了什么,所以需要美化一下它的排版才行

复制上面那串JSON,然后进入BEJSON这个网站,将JSON字符串粘贴到网页里的大输入框,再点击下面的校验或者格式化之类的按钮就会自动排好版式给你看了


初步了解结构化储存

那JSON到底有啥用啊?----它可以表达一些数据对吧,如果你有一个叫data.txt的文件用于储存学校的数据信息,而里面的内容就是这么一片纯文本内容:

XXX学校一共有3355个学生.

如果要用代码判断这个学校的学生是否达到5000人以上就有点麻烦了,以现在的新手阶段,你只能做到把它原文输出来:

$schoolInfo = file_get_contents('data.txt');
echo $schoolInfo;

但是如果你的data.txt的内容是下面这样的话可就不同了:

{"name":"XXX学校","student_nums":3355}

这样代码就可以更容易地解析这些信息,进行一些逻辑判断和输出:

$schoolInfo = file_get_contents('data.txt');
echo $schoolInfo['name'] . '一共有' . $schoolInfo['student_nums'] . '个学生.';
if($schoolInfo['student_nums'] < 5000){
	echo '可是人数还不到5000耶';
}

这叫做结构化储存,用特定的数据结构格式来储存这些数据信息,将能够为程序提供更多的运算可能性

然而如果只是一片以自然语言组合成的纯文本,没有任何结构化的特征,那这片文本很难向程序表达它的含义