JSON与js对象序列化

JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式,它基于js字面量表示法,是js的一个子集。虽然是一个js的子集但是他与语言无关,它可以用于在现在所有的编程语言编写的应用程序之间进行数据交换。是一种文本格式,比较容易读写。

json是一个容纳“名/值”对的无序集合,名字可以是任意字符串,值可以使任意的json类型的值。大多数编程语言都有被映射为json的数据类型,比 如对象(object),字典(dictionary),哈希表(hash map),关联数组(associative array)等。

js有六种类型的值:对象,数组,字符串,数字,布尔值和特殊值null。

    console.log(JSON.parse(‘5‘)); // 5
    console.log(JSON.parse(5)); // 5

    console.log(JSON.parse(‘true‘)); // true
    console.log(JSON.parse(true)); // true

    console.log(JSON.parse(‘"hello"‘)); // "hello"
    console.log(JSON.parse("hello")); // 报错 因为hello不是JSON字符串

    console.log(JSON.parse(‘null‘)); // null
    console.log(JSON.parse(null)); // null

    console.log(JSON.parse(undefined)); // 报错 因为JSON不能表示undefined换用null代替

JSON的结构

JSON具有两种结构:对象,数组

对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字字符串和值之间以”:”分隔,语法结构如代码。

{
    key1:value1,
    key2:value2,
    ...
}

例如:

{
    "name": "hum",
    "age": 26,
    "sex": 1,
    "love": [
        "swing",
        "jump"
    ],
    "birthday": "1988-01-12"
}

NOTE:

  在js中表示JSON字符串时最好在外面加上单引号。

如下:

 console.log(JSON.parse(‘{"num":5,"stop":true,"str":"hello","empty":null}‘));// object{num:5,stop:true,str:"hello",empty: null}

与js对象字面量相比,JSON对象没有变量声明也没有末尾的分号。

数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。

[
   {
       key1:value1,
       key2:value2,
      ...
   }
]

例如:

[
  {
     "Id": 7,
    "Mentions": [
       {
         "Id": 5,
         "StatusId": 34,
         "CreatedDateTime":"\/Date(1310051914617+0100)\/",
         "Text":"Text",
         "UserName":"Username",
        "UserLocation":"UK",
        "UserLanguage":"en-GB",
         "IsCheckIn":"true"
      }
    ],
     "Checkins": 0,
     "HereNow": 0,
     "TimeStamp":"\/Date(1310051914639+0100)\/",
     "Venue": {
       "Id": 7,
       "FoursquareId":"cacbf3bd-f0aa-403d-9f9b-2056b4985ba1",
       "Name":"Venue Name"
     }
   },
   {
       "name":"hahahhahah",
       "port":[
         {
             "port": 8080,
             "protocol":"HTTP",
             "IP":"123.12.06.456"
         }
       ]
   }
]

JSON数组采用的是javascript数组字面量的形式。

JSON的解析与序列化

js的JSON的解析与序列化与AS3是相同的。我们常用的也就是JSON对象(ECMAScript 5中添加的, 早期JSON解析基本都使用javascript的eval()函数。但是eval有一些性能和安全上的缺点,ECMAScript对解析JSON对象进 行了规范,定义了全局对象JSON,支持的浏览器有标准浏览器和IE8+。对于不支持的浏览器可以引入json2.js文件。)的stringify与parse这两个方法。

接下来我们来一一说明。

JSON.stringify

JSON.stringify()将javascript对象序列化为JSON格式的字符串

JSON.stringify(ob,filter,indent)包含三个参数,通常我们在使用的时候只带第一个参数,来返回字符串。

ob:要转化成JSON字符串的对象,数组,原始值。

filter:是一个可选的参数,通常是一个函数,用来在字符串化前对值做一些替换。也可以是一个数组,包含哪些需要字符串化的属性名。就是用来过滤的。

indent:也是一个可选参数,在需要输出格式化的可阅读的代码时,使用indent参数来指定用来缩进的字符串或空格。如果省略该参数,返回的字符串将不带任何的额外的空格,这样输出的值很难阅读。就是用来格式化的。

下面是几个对应的例子:

首先是第二个参数是数组过滤器的时候:

var oJson = { name: ‘hum‘, age: 20, sex: 1};
console.log(JSON.stringify(oJson, [‘age‘, ‘sex‘])); // {"age":20,"sex":1}

如果第二个参数是字符串的时候,该数组会作为对象的属性名,属性名不在这个数组中的任何对象的属性在序列化的时候都会被忽略掉。此外,返回的字符串中的属性的顺序,会与该数组中的属性名一致。

函数过滤器的时候:

var oJson = { name: ‘hum‘, age: 26, sex: 1, love: [‘swing‘, ‘jump‘]};
    console.log(JSON.stringify(oJson, function(k, v){
        switch (k){
            case ‘age‘:
                return v > 20 ? ‘成年‘: ‘未成年‘;
            case ‘love‘:
                return v.join(‘,‘);
            case ‘sex‘:
                return undefined;
            default :
                return v;
        }
    })); // {"name":"hum","age":"成年","love":"swing,jump"}

如果该参数是函数,则它是一个替换函数,该函数会在每一个需要字符串化的对象上调用。这个函数的第一个参数是该对象中的属性名或数组的序号,第二个则是值本身。函数的返回值会替换掉需要字符串化的值,如果函数返回undefined或没有任何的返回值,则会在字符串化的时候忽略这个值。

stringify的第三个参数的实例:

var oJson = { name: ‘hum‘, age: 26, sex: 1, love: [‘swing‘, ‘jump‘]};
    console.log(JSON.stringify(oJson, null, 4));
    /*
     {
         "name": "hum",
         "age": 26,
         "sex": 1,
         "love": [
             "swing",
             "jump"
         ]
     }
    */

通常这个方法的返回值是一个不带任何空格或换行符的给机器阅读的字符串,如果想输出更易于阅读的代码,就需要设置第三个参数了。

再来看一个例子:

var oJson = { name: ‘hum‘, age: 26, sex: 1, love: [‘swing‘, ‘jump‘]};
    console.log(JSON.stringify(oJson, null, ‘--‘));
    /*
     {
     --"name": "hum",
     --"age": 26,
     --"sex": 1,
     --"love": [
     ----"swing",
     ----"jump"
     --]
     }
    */

这样就很容易理解了。。。

JSON.parse

JSON.parse用来解析json格式的字符串(返回一个对象,数组或原始值)

JSON.parse(s,reviver)包含两个方法.

s:要解析的字符串

reviver:用来转换解析值得可选函数

我们通常使用只使用第一个参数,可选参数reviver,主要是在返回解析值之前,对其进行过滤或后期处理。reviver函数会在从s中解析的每个原始值调用一次。调用reviver函数是带有两个参数,第一个属性名(对象的属性名或是转换成字符串的数组序号),第二个参数是对象的属性或是数组的元素值。reviver函数会作为包含原始值的对象/数组的方法来调用。reviver函数的返回值会成为属性的新值,如果reviver返回第二个参数,则属性不变。如果reviver返回undefined或不凡会任何值,则会从对象或是数组中删除属性。

下面是一个实例:

var oJson = { name: ‘hum‘, age: 26, sex: 1, love: [‘swing‘, ‘jump‘], birthday: ‘1988-01-12‘};
    var sJson = JSON.stringify(oJson);
    console.log(sJson);//{"name":"hum","age":26,"sex":1,"love":["swing","jump"],"birthday":"1988-01-12"}
    console.log(JSON.parse(sJson));
    console.log(JSON.parse(sJson, function (k, v) {
        if(k == ‘birthday‘){ // 返回日期对象
            return new Date(v);
        }else if(k == ‘sex‘){ // sex不在了
            return undefined;
        }else{
            return v;
        }
    }));
时间: 2024-10-25 20:19:50

JSON与js对象序列化的相关文章

JSON与JS对象

json 定义 :是一种格式,用于数据交换. Javascript 对象 定义 : 一种javascript的引用类型 区别 对比内容 JSON Javascript 对象 键名 必须是加双引号 可允许加单引号,双引号,也可以不加 属性值 只能是数值(10进制) ,字符串(双引号),布尔值和null,也可以是数组,符合JSON的对象,不能是函数,NaN,Infinity,-Infinity和undefined javascript 中的任意值 逗号问题 最后一个值后面不能有逗号 可以有逗号 数值

C#对JSON的处理和JSON在JS的序列化

JS对Json的处理 json2.js的源码地址: https://github.com/douglascrockford/JSON-js json2.js提供了json的序列化和反序列化方法,可以将一个json对象转换成json字符串,也可以将一个json字符串转换成一个json对象. 在页面中添加json2.js的引用. <script type="text/javascript" src="/CoreResource/JS/json2.min.js"&g

Json 与 JS对象的关系与转换

背景 JavaScript对象与Json对象的关系,Json是JavaScript的一个子集.JavaScript的对象是面向对象语言的一种表示方式,Json则是数据传输的一种格式(比如XML),所以二者之间在定义上没有很大关系:但是二者的格式书写非常相似(有一个细节就是:JS对象的key是可以使用引号也可以不使用:可是Json格式则必须对key使用引号),所以JS对象与Json非常容易转换,不过一定要记住,在JavaScript语言中Json只是一种符合固定格式的字符串,只是字符串! 1 使用

js对象序列化JSON.stringify()与反序列化JSON.parse()

草稿: parse用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":"23"}' 结果: JSON.parse(str) Object age: "23" name: "huangxiaojian" __proto__: Object 注意:单引号写在{}外,每个属性名都必须用双引号,否则会抛出异常. string

JSON和JS对象之间的互转

1. jQuery插件支持的转换方式 $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2. 浏览器支持的转换方式(Firefox,chrome,opera,safari,ie9,ie8)等浏览器: JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON.stringify(jsonobj); //可以将json对象转换成json对符串  注:ie8(兼容模式),

JSON转JS对象,JS对象转JSON

一.从服务端发来的json字符串,怎么才能作为JavaScript对象(JSON对象)在web端调用呢? 1.如果使用jQuery,就很方便了,可以在ajax一系列函数中,把参数Datatype传json即可,返回的data即为JSON对象. PS:如果要对表单处理为json字符串,可以使用.serialize()与.serializeArray()处理,如果要作为URL调用,则可以使用jQuery.param()处理. 2.$.parseJSON( jsonstr) 3.浏览器自带的JSON.

JSON转换为js对象

有两种方法eval  JSON.parse区别在于JSON内部值插入alert   也会执行  这个是非常的危险 如果别人插入恶意代码之类的JSON.parse 会提示错误信息 推荐使用JSON.parse 校验JSON的工具 http://www.jsonlint.com/

json转js对象

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <script type="text/javascript" src="scripts/jquery.js" ></script> <script type="text/j

js之oop &lt;五&gt;对象序列化

js对象序列化的过程,就是对象转换为JSON的过程.JSON.stringify() 将对象序列化成JSON.(接收对象,输出字符串) var obj = {x:2,y:3}; var str = JSON.stringify(obj); //输出 {"x":2,"y":3} 序列化时,对象的函数序列化时不会显示. var obj = {a:1,b:2,c:function(){ console.log(3); }}; var str = JSON.stringif