likes
comments
collection
share

关于PHP解析JSON的分析

作者站长头像
站长
· 阅读数 24

最近接触到了JSON的文件类型,觉得很强大高效,所以研究了一下,总结一下自己的理解。建立一个JSON文件,内容如下(该内容为Hbuilder打开后的内容),可以看出该内容嵌套了2组键→值组:

{
    "FDB214F1":[{"item":"重量","description":"重量1"},{"item":"寿命","description":"寿命1"},{"item":"噪音","description":"噪音1"}]
    ,"FDB04A2":[{"item":"重量","description":"重量2"},{"item":"寿命","description":"寿命2"},{"item":"噪音","description":"噪音2"}]
}

那么如何使用php语法解析想要的内容呢?


一、获取JSON文件内容

<?php
    $json_string=file_get_contents('../data01.json');//获取JSON文档内容
    echo $json_string;
    //$json_string获取到源文件的原本内容
    echo "<br />";
    echo $json_string[6];
?>

结果如下:关于PHP解析JSON的分析可以看到1、json_string获取到源文件的原本内容2、json_string[6]获取到该内容的第6个字符但是本人试过用count($json_string)无法获取总的字符数量。


二、解析内容

<?php
$json_string=file_get_contents('../data01.json');
$json_array=json_decode($json_string,true);        
print_r($json_array);
echo "<br />";
echo $json_array;
echo "<br />";
echo $json_array[0];
echo "<br />";
echo $json_array["FDB214F1"];
?>

程序输出:关于PHP解析JSON的分析可以看到:1、实际上json_array已经是将json_string(源文件内容)解析后的结果。每个{}都被当做一个数组array。2、用echo只能输出array,而得不到具体的想要的内容,即使用json_array[0]也是没有用的。3、但echo用json_array["FDB214F1"]指定key值的时候也是可以得到array的。这个时候如果将json内容更改为如下:

{
    "FDB214F1":"FDB04A2"
}

再执行上述代码可以得到:关于PHP解析JSON的分析可以看到:1、这个时候我们得到了一个具体的值。两种情况分析可知,当最终指向不是具体值的时候,得到的就是array,反之是具体值的时候,我们就会得到具体的值。


三、获取键值从上边的例子中我们不免想要提升一个高度,如何得到所有的键和所有的值呢?举例json的内容如下:

{
    "key1":"value1","key2":"value2","key3":"value3","key4":"value4","key5":"value5"
}

遍历代码如下:

<?php
$json_string=file_get_contents('../data01.json');
$json_array=json_decode($json_string,true);
foreach($json_array as $key=>$v) {
    echo $key."<br />";
}
foreach($json_array as $key=>$v) {
    echo $v."<br />";
}
?>

程序输出:关于PHP解析JSON的分析可以看出:1、使用代码中的遍历格式,可以得到相应的键与值。再进一步,回到最初的例子:

{
    "FDB214F1":[{"item":"重量","description":"重量1"},{"item":"寿命","description":"寿命1"},{"item":"噪音","description":"噪音1"}]
    ,"FDB04A2":[{"item":"重量","description":"重量2"},{"item":"寿命","description":"寿命2"},{"item":"噪音","description":"噪音2"}]
}

执行刚才的代码可以得到:关于PHP解析JSON的分析可以看出我们得到了键,但是得不到具体的值,这是因为之前说过的这里的值是一个集合,并不是一个具体的值。这时我们就需要指定到具体的内容:

<?php
$json_string=file_get_contents('../data01.json');
$json_array=json_decode($json_string,true);
$json_array01=$json_array["FDB214F1"];
foreach($json_array01 as $key=>$v) {
echo $key."<br />";
}
foreach($json_array01 as $key=>$v) {
echo $v."<br />";
}
?>

程序输出:关于PHP解析JSON的分析可以看到:1、指定了FDB214F1这个字段后,实际得到的是这样的一个集合:Array ( [0] => Array ( [item] => 重量 [description] => 重量1 ) [1] => Array ( [item] => 寿命 [description] => 寿命1 ) [2] => Array ( [item] => 噪音 [description] => 噪音1 ) )在这个集合里没有具体的键,只有并列的3个{...}。因此其默认键为0,1,2。2、得不到具体的值,这是因为之前说过的这里的值是一个集合,并不是一个具体的值。因此再优化一次代码:

<?php
$json_string=file_get_contents('../data01.json');
$json_array=json_decode($json_string,true);
$json_array01=$json_array["FDB214F1"];
foreach($json_array01[0] as $key=>$v) {
echo $key."<br />";
}
foreach($json_array01[0] as $key=>$v) {
echo $v."<br />";
}
?>

就可以得到:关于PHP解析JSON的分析可以看到:我们得到了第一个{}中的键和值。


四、count值在经过json_decode之后,我们也可以得到相应的集合数量了在上面代码的基础上增加:

<?php
$json_string=file_get_contents('../data01.json');
$json_array=json_decode($json_string,true);
$json_array01=$json_array["FDB214F1"];
foreach($json_array01[0] as $key=>$v) {
echo $key."<br />";
}
foreach($json_array01[0] as $key=>$v) {
echo $v."<br />";
}
echo count($json_array);
echo "<br />";
echo count($json_array01);
?>

我们就可以得到相应的集合数量:关于PHP解析JSON的分析


五、encode转码有的时候需要将json的内容以一定的格式输出,这个时候就要用到encode还是上边的例子,直接上代码:

<?php
            $json_string=file_get_contents('../data01.json');
            $json_array=json_decode($json_string,true);
            $json_array01=$json_array["FDB214F1"];
            echo json_encode($json_array,JSON_UNESCAPED_UNICODE);
            echo "<br />";
            echo json_encode($json_array01,JSON_UNESCAPED_UNICODE);
            echo "<br />";
            echo json_encode($json_array01[0],JSON_UNESCAPED_UNICODE);
            ?>

程序输出:关于PHP解析JSON的分析