json数据格式学习总结

本文详细介绍了PHP和JS中Json数据格式的规则和操作,包括PHP中的json_encode和json_decode函数,以及JS中的JSON.parse()和JSON.stringify()方法。文中通过示例解释了如何在两者之间进行转换,并探讨了数组和对象的区别以及序列化时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP中Json格式规则

详见阮一峰老师的网络日志
- 并列的数据之间用逗号(”, “)分隔
- 映射用冒号(”: “)表示
- 并列数据的集合(数组)用方括号(“[]”)表示
- 映射的集合(对象)用大括号(”{}”)表示

这里摘取阮一峰老师的举例,留作日后温习
下面这句话:
“北京市的面积为16800平方公里,常住人口1600万人。上海市的面积为6400平方公里,常住人口1800万。”
写成json格式就是这样:

[
  {"城市":"北京","面积":16800,"人口":1600},
  {"城市":"上海","面积":6400,"人口":1800}
]

JS中数组和对象的区别

  • 数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象
  • 另一个区别是,数组的数据没有”名称”(name),对象的数据有”名称”(name)

在JS中,关联数组就是对象,对象就是关联数组
例如对象:

var a={"城市":"北京","面积":16800,"人口":1600};

写成关联数组形式:

a["城市"]="北京";
a["面积"]=16800;
a["人口"]=1600;

这一点与php语言完全不同,在php中,关联数组也是数组。

var a=[1,2,3,4];
a['foo']='Hello World';
alert(a.length);//4

在JS中最后的结果是4,也就是说,数组a的元素个数是4个。
但是,运行同样内容的php代码就不一样了:

<?php
$a=array(1,2,3,4);
$a["foo"]="Hello world";
echo count($a);
?>

最后的结果是5,也就是说,数组a的元素个数是5个。

PHP中操作json的函数

  • 加密 json_encode
  • 解密 json_decode
一维数组到json数据格式的转换
<?php
$arr_1 = array();
$arr_1['username'] = 'lisi';
$arr_1['age'] = 20;
echo json_encode($arr_1);//{"username":"lisi","age":20}
  ?>
多维数组到json数据格式的转换
<?php
$arr_2 = array();
// 三维数组
$arr_2['member']['lisi']['job'] = "worker";
$arr_2['member']['lisi']['age'] = 30;
$arr_2['member']['wangwu']['job'] = "student";
$arr_2['member']['wangwu']['age'] = 10;

echo json_encode($arr_2);
//{"member":{"lisi":{"job":"worker","age":30},"wangwu":{"job":"student","age":10}}}
  ?>
对象到json数据格式的转换

对象转化为json数据时,只转换公有变量,私有变量不转换

<?php
class Person{
    public $name = "public name";
    protected $ptName = "protected name";
    private $pName = "private name";

    public function sayName(){
        return $this->name;
    }
}
$person1 = new Person();
echo json_encode($person1);//{"name":"public name"}
  ?>
转换json数据格式到对象类型
<?php
$jsonStr = '{"key1":"value1","key2":"value2"}';
print_r(json_decode($jsonStr,false));//stdClass Object ( [key1] => value1 [key2] => value2
?>
转换json数据格式到数组类型
<?php
$jsonStr = '{"key1":"value1","key2":"value2"}';
print_r(json_decode($jsonStr,true));//Array ( [key1] => value1 [key2] => value2 )
?>

json_decode($jsonStr,true); 第二个参数如果是true ,那么结果会被转换为array类型,参数默认为false,默认转换为对象

JS中json数据格式学习

JSON语法可以表示以下3中类型的值:

  • 简单值(JSON中可以表示数值,字符串,布尔值,null。但是不支持undefined)
  • json对象
  • json数组

ECMAScript5定义了一个原生的JSON对象,可以用来将对象序列化为JSON字符串或者将JSON数据解析为Javascript对象。JSON.stringify()JSON.parse()方法分别用来实现这两项功能。

  • JSON.stringify()–将对象序列化为JSON字符串
  • JSON.parse()–将JSON数据解析为Javascript对象
<script type="text/javascript">
        var book = {
                       "title": "Professional JavaScript",
                        "authors": [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011
                   };

        var jsonText = JSON.stringify(book);
        alert(jsonText);
        var bookCopy = JSON.parse(jsonText);
        //注意:虽然book与bookCopy具有相同的属性,但它们是两个独立的、没有任何关系的对象
        alert(bookCopy.title);
    </script>

在序列化Javascript对象时,所有函数及原型成员都会被忽略,不体现在结果中。此外,值为undefined的任何属性也都会被跳过。结果中最终都是值为有效JSON数据类型的实例属性。

JSON.parse()

JSON.parse()方法还可以接收第二个参数,该参数是一个函数,称为还原函数。如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。在将日期字符串转换为Date对象时,经常要用到还原函数。

<script type="text/javascript">
        var book = {
           "title": "Professional JavaScript",
                        "authors": [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011,
                        releaseDate: new Date(2012, 11, 1)
                   };

        var jsonText = JSON.stringify(book);
        alert(jsonText);

        var bookCopy = JSON.parse(jsonText, function(key, value){
            if (key == "releaseDate"){
                return new Date(value);//将日期字符串转换为日期对象
            } else if(key == "edition") {
                return undefined;//返回undefined表示删除edition
            }else{
                return value;//其他返回原值
            }
        });
        console.log(bookCopy);
        alert(bookCopy.releaseDate.getFullYear());//2012
        alert("releaseDate" in bookCopy);//true
    </script>

JSON.stringify()

JSON.stringify()除了要序列化的Javascript对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化Javascript对象。第一个参数是一个过滤器,可以是一个数组,也可以是一个函数,第二个参数是一个选项,表示是否在JSON字符串中保留缩进。单独或组合使用这两个参数,可以更全面深入地控制JSON的序列化。

<script type="text/javascript">
        var book = {
            title: "Professional JavaScript",
                        authors: [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011
                   };
        //这里过滤参数是数组,表示JSON.stringify()结果中将只包含数组中列出的属性
        var jsonText = JSON.stringify(book, ["title", "edition"]);
        alert(jsonText);
    </script>

第二个参数是函数的情况:函数接收两个参数:属性键名和属性值。根据属性键名可以知道应该如何处理要序列化的对象中的属性,键名可以是空字符串。为了改变序列化对象的结果,函数返回的值就是相应键的值。但是,如果函数返回了undefined,相应的属性会被删除。

<script type="text/javascript">
        var book = {
        title: "Professional JavaScript",
                        authors: [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011
                   };
        var jsonText = JSON.stringify(book, function(key, value){
            switch(key){
                case "authors"://表示如果键为"authors",就将数组连接为一个字符串
                    return value.join(",")
                case "year"://表示如果键为"year",就将其值设为5000
                    return 5000;
                case "edition"://表示如果键为"edition",就将其删除
                    return undefined;
                default://default项表示其他值正常显示
                    return value;
            }
        });
        alert(jsonText);
    </script>

JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果参数是一个数值,那么表示的是每个级别缩进的空格数。只要传入有效的控制缩进的参数值,结果字符串就会包含换行符。最大缩进空格数为10,所有大于10的值都会自动转换为10

<script type="text/javascript">
        var book = {
         title: "Professional JavaScript",
                        authors: [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011
                   };
        var jsonText = JSON.stringify(book, null, 4);//这个表示每个级别缩进4个空格
        alert(jsonText);
    </script>

如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符。缩进字符串的长度也不能超过10个,超过10个将只显示前10个字符。

<script type="text/javascript">
        var book = {
        "title": "Professional JavaScript",
                        "authors": [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011
                   };
        var jsonText = JSON.stringify(book, null, "--");
        alert(jsonText);
    </script>

toJSON()方法可以返回其自身的JSON数据格式
可以让toJSON()方法返回任何序列化的值,也可以让这个方法返回undefined,此时如果包含它的对象嵌入在另一个对象中,会导致对象的值变成null,而如果包含它的对象是顶级对象,结果就是undefined

<script type="text/javascript">
var book = {
              "title": "Professional JavaScript",
                        "authors": [
                            "Nicholas C. Zakas"
                        ],
                        edition: 3,
                        year: 2011,
                        toJSON: function(){
                            return this.title;
                            // return undefined;
                        }
                   };

        var jsonText = JSON.stringify(book);
        alert(jsonText);//"Professional JavaScript"
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值