js解析与序列化json数据(二)序列化探讨

上一节我们讲解了JSON.stringify()的基本用法,这一节我们来重点探讨一下序列化。
JSON.stringify()除了要序列化的js对象外,还可以接收另外两个参数,这两个参数用于指定不同方式序列化js对象。第一个参数是过滤器,可以使一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。单独或组合使用这两个参数,可以更全面深入地控制JSON的序列化。
1、过滤结果
如果过滤器参数是数组,那么JSON.stringify()的结果中将只包含数组中列出的属性。如:


代码如下:

<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114"
};
var jsonText=JSON.stringify(student,["name","id"]);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="测试" />
</body>
</html>

jsonText的值为
{"name":"Bill","id":"802020114"}
如果第二个参数是函数,行为会有一点不同。传入的函数接收两个参数,属性(键)名和属性值。根据属性(键)名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串。
为了改变序列化对象的结果,函数返回的值就是相应键的值。不过要注意,如果函数返回了undefined,那么相应的属性会被忽略。如:


代码如下:

<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"]
};
var jsonText=JSON.stringify(student,jsonConvert);
}
function jsonConvert(key,value)
{
switch (key)
{
case "name":
return "Lily";
case "grade":
return undefined;
case "subject":
return value.join(",");
default :
return value;
}
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="测试" />
</body>
</html>

这里函数过滤器根据传入的键来决定结果。如果键为name,就将其值设置为Lily;如果为grade就返回undefined来删除该属性;如果为subject,它是一个数组,就将它通过数组方法join()转化为以逗号连接的字符串。最后一定要提供default项,使其他的值都能够正常出现在结果中,不然就会出错,没有结果。实际上,第一次调用这个函数过滤器,传入的键是一个空字符串,而值就是student对象。上面的jsonText的值如下:
{"name":"Lily","age":12,"id":"0802020114","subject":"math,Chinese,English"}
在内部是按顺序遍历每一个对象每一个属性,所以公开key,value函数方法需要注意你的函数只有着两个参数才能起效,要理解函数的目的,就是在内部机制遍历每一个属性的时候让你来修改部分结果,并且是一次遍历每一个对象,这样在序列化对象中每一个对象都要经过过滤器。
2、字符串缩进
JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那么它表示的是每个级别缩进的空格数。如:


代码如下:

<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"]
};
var jsonText=JSON.stringify(student,null,8);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="测试" />
</body>
</html>

保存在jsonText中的字符串为:


代码如下:

{
"name": "Bill",
"age": 12,
"grade": 3,
"id": "0802020114",
"subject": [
"math",
"Chinese",
"English"
]
}

JSON.stringify()在结果字符串中插入了换行符以提高可读性。只要传入有效的控制缩进的参数值,结果字符串就会包含换行符(只缩进而不换行意义不大)。最大缩进空格数位10,所有大于10的值都会自定转换为10。

如果缩进参数是一个字符串而非数值,则这个字符串将在JSON字符串中被用作缩进字符(不再使用空格)。如可以实现如下的效果:


代码如下:

{
*"name": "Bill",
*"age": 12,
*"grade": 3,
*"id": "0802020114",
*"subject": [
**"math",
**"Chinese",
**"English"
*]
}

同样字符串最长不能超过10个字符长。如果超过,结果中将只出现10个字符。
3、toJSON()方法
有时候JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。在这些情况下,可以通过对象上调用toJSON()方法,返回其自身的JSON数据格式。如:


代码如下:

<html>
<head>
<title></title>
<script type="text/javascript">
function init()
{
var student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"],
toJSON:function(){
return this.name+"_"+this.id;
}
};
var jsonText=JSON.stringify(student);
}
</script>
</head>
<body>
<input type="button" onclick="init()" value="测试" />
</body>
</html>

以上代码在student对象上定义了一个toJSON()方法,该方法返回name和id的组合。最后jsonText的值如下:
"Bill_0802020114"
toJSON()可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要。假设把一个对象传入JSON.stringify(),序列化该对象的顺序是:
(1)如果存在toJSON()方法而且能够通过它取得有效值,则调用该方法。否则,按默认顺序执行序列化。
(2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
(3)对第(2)步返回的每个值进行相应的序列化。
(4)如果提供了第三个参数,执行相应的格式化。
无论是考虑滴定toJSON()方法,还是考虑使用函数过滤器,或者需要同时使用两者,理解这个顺序都是至关重要的。

(0)

相关推荐

  • 浅析JSON序列化与反序列化

    方法一:引入System.Web.Script.Serialization命名空间使用 JavaScriptSerializer类实现简单的序列化序列化类:Personnel 复制代码 代码如下: public class Personnel        {            public int Id { get; set; }            public string Name { get; set; }        } 执行序列化反序列化: 复制代码 代码如下: prote

  • JSON序列化与解析原生JS方法且IE6和chrome测试通过

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&qu

  • JSON与js对象序列化实例详解

    本文实例讲述了JSON与js对象序列化.分享给大家供大家参考,具体如下: JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式,它基于js字面量表示法,是js的一个子集.虽然是一个js的子集但是他与语言无关,它可以用于在现在所有的编程语言编写的应用程序之间进行数据交换.是一种文本格式,比较容易读写. JSON是一个容纳"名/值"对的无序集合,名字可以是任意字符串,值可以使任意的JSON类型的值.大多数编程语言都有

  • Jquery 组合form元素为json格式,asp.net反序列化

    作者:敖士伟 Email:ikmb@163.com 转载注明作者 说明: 1.js根据表单元素class属性,把表单元素的name和value组合为json格式;用表单元素class属性可以针对性地组合JSON数据. 2.后端ASP.NET用JavaScriptSerializer反序列化为对象实列. 3.好处:简化了前端数据读取与后端数据赋值. 复制代码 代码如下: function GetJSONStr(class_name) { var a = []; //文本框 $("." +

  • Json序列化和反序列化方法解析

    复制代码 代码如下: /// <summary>        /// Json序列化,用于发送到客户端        /// </summary>        public static string ToJsJson(this object item)        { DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType()); using (MemoryStr

  • js解析与序列化json数据(三)json的解析探讨

    这一节我们主要讨论json的解析. JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将早每个键值对上调用.为了区别JSON.stringify()接收的替换(过滤)函数(replacer),这个函数被称作还原函数(reviver),但实际上这两个函数的签名是相同的--它们都接收连个参数,一个键和一个值,而且都需要返回一个值. 如果还原函数返回undefined,则表示要从结果中删除相应的键:如果返回其他值,则将该值插入到结果中.如: 复制代码 代码如下: <html> &l

  • JS实现json的序列化和反序列化功能示例

    本文实例讲述了JS实现json的序列化和反序列化功能.分享给大家供大家参考,具体如下: 序列化: var s = new Object(); s.Name = "clientValue"; s.Id = 1; s.ClassId = 2; var data = JSON.stringify(s); console.log(data); 反序列化: eval将字符串反序列化成对象 var s = eval('(' + data+ ')'); console.log(s.Name); 完整

  • JSON键值对序列化和反序列化解析

    什么是JSON? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write and easy for machines to parse and generate. JSON is a text format that is completely language independent. 翻译:Json[javascrip

  • js解析与序列化json数据(一)json.stringify()的基本用法

    早期的JSON解析器基本上就是使用JavaScript的eval()函数.由于JSON是JavaScript语法的自己,因此eval()函数可以解析.解释并返回JavaScript的对象和数组. ECMAScript 5对解析JSON的行为进行了规范,定义了全局对象JSON. JSON对象有两个方法:stringify()和parse().在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript.例如: 新建一个HTML

  • js解析与序列化json数据(二)序列化探讨

    上一节我们讲解了JSON.stringify()的基本用法,这一节我们来重点探讨一下序列化. JSON.stringify()除了要序列化的js对象外,还可以接收另外两个参数,这两个参数用于指定不同方式序列化js对象.第一个参数是过滤器,可以使一个数组,也可以是一个函数:第二个参数是一个选项,表示是否在JSON字符串中保留缩进.单独或组合使用这两个参数,可以更全面深入地控制JSON的序列化. 1.过滤结果 如果过滤器参数是数组,那么JSON.stringify()的结果中将只包含数组中列出的属性

  • Go语言对JSON数据进行序列化和反序列化

    golang中对json的序列化/反序列化操作还是比较容易的,序列化操作主要是通过encoding/json包的Marshal()方法来实现,反序列化操作主要是通过encoding/json包的Unmarshal()方法来实现. //JSON序列化和反序列化 //可用在api序列化输出 //转成结构体,方便程序操作等 package main import ( "encoding/json" "fmt" ) type Response1 struct { Page

  • jQuery使用ajax方法解析返回的json数据功能示例

    本文实例讲述了jQuery使用ajax方法解析返回的json数据功能.分享给大家供大家参考,具体如下: 最近在用jQuery的ajax方法传递接收json数据时发现一个问题,那就是返回的data数据,有时候可以直接作为json数据使用,可有时候又不行.查了些资料,解释如下: $.ajax({ url: ajaxurl, type: "POST", success: function(data){ //假设返回的json数据里有status及info2个属性 //有时候可以直接ajaxo

  • JS对象序列化成json数据和json数据转化为JS对象的代码

    JS对象序列化成json数据: function Serialize(obj){ switch(obj.constructor){ case Object: var str = "{"; for(var o in obj){ str += o + ":" + Serialize(obj[o]) +","; } if(str.substr(str.length-1) == ",") str = str.substr(0,str.

  • vue.js实现数据库的JSON数据输出渲染到html页面功能示例

    本文实例讲述了vue.js实现数据库的JSON数据输出渲染到html页面功能.分享给大家供大家参考,具体如下: 1.首先通过json.php把数据库给输出为json格式的数据 [ { "id":1, "resname":"百度", "resimg":"http://www.baidu.com/1.jpg", "resint":"2018-1-18", "re

  • js 与 php 通过json数据进行通讯示例

    js 与 php 通过json数据进行通讯 例子: php文件 复制代码 代码如下: <?php echo json_encode(array(array( 'liaotiantiao'=>$liaotiantiao, 'liaotiank'=>$liaotiank, 'chatuserid'=>$chatuserid, 'chattouserid'=>$chattouserid ))); ?> html 文件 复制代码 代码如下: $(document).ready(

  • java中fastjson生成和解析json数据(序列化和反序列化数据)

    本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>) 2.通过一个android程序测试fastjson的用法. fastjson简介: Fastjson是一个Java语言编写的高性能功能完善的JSON库.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jack

  • js数组如何添加json数据及js数组与json的区别

    JSON(JavaScript Object Notation )是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,JSON是JavaScript原生数据格式. 下面给大家介绍js数组添加json数据的两种方式. // 第一种方式 personInfo : [], for(var i = 0; i < _STAGE.passengerInfoArray.length; i++){ var name = _STAGE.passengerInfoArray[i]; var person =

  • 使Ext的Template可以解析二层的json数据的方法

    Ext的Template支持通过传入json数据的方式进行模板替换. API中有这样一段示例: 复制代码 代码如下: var t = new Ext.Template(      '<div name="{id}">',          '<span class="{cls}">{name:trim} {value:ellipsis(10)}</span>',      '</div>'  );  t.append(

  • 如何利用Python解析超大的json数据(GB级别)

    使用Python解析各种格式的数据都很方便,比如json.txt.xml.csv等.用于处理简单的数据完全足够用了,而且代码简单易懂. 前段时间我遇到一个问题,如何解析超大的json文件呢?刚开始天真的我在使用json.load直接加载json文件,然而内存报错却给了我当头一棒,json.load它是直接将数据加载到内存中然后解析出来的,这说明什么呢?当你的json文件过于庞大的时候,你的电脑内存装不下你的json文件,这时候就相当尴尬了,加载不了,解析不了!! 怎么办呢?我赶紧上网查阅资料,网

随机推荐