json详解

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);
}

这样会自动加双引号,并返回数组或者对象

原文地址:https://www.cnblogs.com/blueskycc/p/5312883.html