JSON有两种表示结构,对象和数组。
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。
{
key1:value1,
key2:value2,
...
}
其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组
数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。
[
{
key1:value1,
key2:value2
},
{
key3:value3,
key4:value4
}
]
之前我一直有个困惑,分不清普通字符串,json字符串和json对象的区别。经过一番研究终于给弄明白了。比如在js中。
字符串:这个很好解释,指使用“”双引号或’’单引号包括的字符。例如:var comStr = 'this is string';
json字符串:指的是符合json格式要求的js字符串。例如:var jsonStr = "{StudentID:'100',Name:'tmac',Hometown:'usa'}";
json对象:指符合json格式要求的js对象。例如:var jsonObj = { StudentID: "100", Name: "tmac", Hometown: "usa" };
举例说明
var json1 = { "a":{"pic":"1.jpg","mp4":"1.mp4"},"b":['bb','cc']}; var json2 = [{"a":"aa"},{"b":{"c":"cc"}},{"d":["dd",{"e":"ee"}]}]; alert(json1.a.pic);//结果:1.jpg alert(json1.b[1]);//结果:cc alert(json2[0].a);//结果:aa alert(json2[1].b.c);//结果:cc alert(json2[2].d[0]);//结果:dd alert(json2[2].d[1].e);//结果:ee
js中对json要求不严格,即使没有引号,也可以使用,但是php中key必须使用双引号引起来,单引号都不行!
js中可以这样使用
var abc = {a:[0,1,2,3,4,5,6,7,8],b:[9,10,11,12,13,14,15,16,17,18,19]};//没有引号
var abc = {'a':[0,1,2,3,4,5,6,7,8],'b':[9,10,11,12,13,14,15,16,17,18,19]};//单引号
var abc = {"a":[0,1,2,3,4,5,6,7,8],"b":[9,10,11,12,13,14,15,16,17,18,19]};//双引号
alert(abc.a);都可以
如果key是数字,则这样
var abc = {0:[0,1,2,3,4,5,6,7,8],1:[9,10,11,12,13,14,15,16,17,18,19]};//没有引号
alert(abc[0]);//即使加引号,数字也是这样用
php中则必须是双引号
$abc = '{"a":[0,1,2,3,4,5,6,7,8],"b":[9,10,11,12,13,14,15,16,17,18,19]};
var_dump(json_decode($abc,true));
如果key没有加双引号可以用以下方法
function ext_json_decode($str, $mode=false){
if(preg_match('/\w:/', $str)){
$str = preg_replace('/(\w+):/is', '"$1":', $str);
}
return json_decode($str, $mode);
}
这样会自动加双引号,并返回数组或者对象