JSON

什么是JSON?

JSON它是一种数据格式,而不是一门编程语言,它利用了JavaScript中的一些模式来表示结构化数据,虽然看上去JSON和JavaScript具有相同的语法形式,但JSON并不属于JavaScript,而且诸多的语言都可以用JSON因为它只是一种数据格式,在JSON出现之前很长一段时间都以XML作为互联网上传输结构化数据的标准,之前的web服务器与服务器之间通信都是建立在XML之上的,然而不少人认为XML不易读而且过于繁琐、多余。还好在2006年Douglas Crockford将JSON作为一个标准提交给IETF,虽然在之前的2001年就已经开始使用,但在2006年后才慢慢被大家所喜欢。

一、JSON语法

JSON可以表示为以下三种类型值

  1. 简单值

可用JavaScript语法表示JSON,如字符串、数值、布尔值、null但不支持特殊的undefined。

5
“helloworld”
  1. 对象

对象作为复杂的数据类型,用一组无序的键值对来表示出复杂的JSON数据。

var  object = {
                "name":"sanyeyu",
                "age":22,
                "work":"web全栈"
              };
  1. 数组

数组也是复杂的数据类型,它用一组有序的值来表示出复杂的JSON数据,它可以通过下标来访问其中的值。

 [
 {
    "name":"sanyeyu",
    "age":"22",
    "aothing":[13,"hhj"],
    "fx":"fg"
},
{
    "name":"sanyeyu"",
    "age":"22",
    "aothing":[13,"hhj"],
    "fx":"fg"
}];

二、JSON对象

  1. 早期的JSON解析基本上都是用的JavaScript的 eval() 函数,因为JSON是JavaScript的子集,所以 eval()
    可以解析并返回JavaScript的对象和数组,但由于 eval() 对JSON数据结构求值存在风险,可能会执行一些恶意代码,对于不能原生支持JSON解析的浏览器,使用shim是最佳选择。
  1. JOSN对象有两个方法 stringify()parse()

stringify() 把JavaScript对象系列化为JSON字符串以便处理。

var object = {
                "name":"sanyeyu",
                "age":"22",
                "aothing":[13,"hhj"],
                "fx":"fg"
             };
var jsontext = JSON.stringify(object,null);
console.log(jsontext);

    //{"name":"sanyeyu","age":"22","aothing":[13,"hhj"],"fx":"fg"}

parse()把JSON字符串解析为原生JavaScript值。

var hh = JSON.parse(jsontext,null);
    console.log(hh);

    //{name: "sanyeyu", age: "22", aothing: Array(2), fx: "fg"}age: "22"aothing: (2) [13, "hhj"]fx: "fg"name: "sanyeyu"__proto__: Object

三、解析与序列化选项

  1. 过滤结果

stringify() 方法的第二个参数是一个数组表示要过滤的属性。

const object = {
                    "name":"sanyeyu",
                    "age":"22",
                    "aothing":[13,"hhj"],
                    "fx":"fg"
              };
const jsontext = JSON.stringify(object,["aothing"]);
console.log(jsontext);

        //{"aothing":[13,"hhj"]}
  1. 字符串缩进

stringify() 方法的第三个参数表示要缩进几个字符串,也可以填写其他符号,但缩进字符串不能超过10个字符串。

1、添加数组
const object = {
                    "name":"sanyeyu",
                    "age":"22",
                    "aothing":[13,"hhj"],
                    "fx":"fg"
               };
const jsontext = JSON.stringify(object,null,4);
console.log(jsontext);

    //输出
    {
        "name": "sanyeyu",
        "age": "22",
        "aothing": [
            13,
            "hhj"
        ],
        "fx": "fg"
    }

2.添加其他符号
const object = {
                    "name":"sanyeyu",
                    "age":"22",
                    "aothing":[13,"hhj"],
                    "fx":"fg"
               };
const jsontext = JSON.stringify(object,null,[]);
console.log(jsontext);

    //输出
{
    []"name": "sanyeyu",
    []"age": "22",
    []"aothing": [
    [][]13,
    [][]"hhj"
    []],
    []"fx": "fg"
}

四、toJSON()方法

  1. 有时候 JSON.stringify() 还是不能满足某些对象进行自定义序列化的需求,所以在某些特殊情况下可以给对象定义 toJSON() 方法,返回其自身的JSON数据格式。
const object = {
                    "name":"sanyeyu",
                    "age":"22",
                    "aothing":[13,"hhj"],
                    "fx":"fg",
                    toJSON: function(){
                        return this.aothing;
               }
        };
const jsontext = JSON.stringify(object,null,2);
console.log(jsontext);

    //输出
    [
        13,
        "hhj"
    ]
  1. JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用,为了区别于JSON.stringify() 接收的过滤函数,它被称为还原函数,但它们都基本上是相同的,都接收两个参数,键和值而且都需要返回一个值.
    如果还原函数返回undefined,则表示要从结果中删除相应的键,如果返回其他值,则将该值插入到结果中去,一般在将日期转换为Date对象时,经常要用到还原函数。
const object = {
                    "name":"sanyeyu",
                    "age":"22",
                    "aothing":[13,"hhj"],
                    "fx":"fg",
                    year:2017,
                    redate: new Date(2017, 10, 1),
                    // toJSON: function(){
                    //     return this.age;
                    // }
               };
const jsonText = JSON.stringify(object,null,3);
console.log(jsonText);
const obbook = JSON.parse(jsonText, function(key, value){
    if(key == "redate"){
        return new Date(value);
    }else{
        return value;
    }
})
console.log(obbook);

//输出
{
    "name": "sanyeyu",
    "age": "22",
    "aothing": [
    13,
    "hhj"
    ],
    "fx": "fg",
    "year": 2017,
    "redate": "2017-10-31T16:00:00.000Z"
}


   转载规则


《JSON》 三叶雨 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录