话说JSON数据平常用的确实挺多的,但是基本上只知道怎么用,对其一些细节并没有整理过,今儿趁着下午有点空,坐下来,学习整理下,并分享出来。

对于JSON,首先它只是一种数据格式,并非一种语言,虽然和javascript长的比较像,但并不从属于javascript。如果你使用过其他编程语言,就会知道,其他语言也有针对JSON的解析器和序列化器。

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

  •       简单值    如字符串、数值、布尔值和null,但不支持undefined
  •       对象       对象作为一种复杂的数据类型,表示是一组无序的键值对儿,值可以是简单值也可以复杂的数据
  •       数组       数组作为一种复杂的数据类型,表示是一组有序的列表儿,可以通过索引来获取引用的值,值可以是简单值,也可以复杂数据对象

1 . 简单值

简单值里没有什么可以重点讲的,主要强调一点,而且非常重要,那就是 JSON 字符串必须使用双引号,单引号会报错。

2. 对象

javascript 中的对象

var object = {

                  name:"suyq",

                  age :9

       }

JSON 对象

{
"name":"suyq",
"age" :9
}

与javascript对象相比,JSON对象有两个地方不一样

  1. 没有声明变量(JSON中没有变量的概念)
  2. 末尾没有分号

再说一遍 对象的属性必须加双引号,这个是必须的。

属性的值可以是简单类型,也可以是复杂类型的值。

{
"name":"suyq",
"age" :9,
"school":{
"name":"tjn",
"location":"tj"
}
}

3.数组

javascript中的数组字面量

var  v = [1,"hi",true];

  JSON中的数组

[
{
"name": "张三",
"age": 18
},
{
"name": "李四",
"age": 22
},
{
"name": "王五",
"age": 20
}
]

  JSON对象

json 对象主要有两个方法

      JSON.stringify();

      把javascript 对象转换为json对象

      

 var book =
{
title:"javascript",
authors:["li","susan"],
year:2011,
edition:undefined
};
console.log(JSON.stringify(book));

输出结果:

{"title":"javascript","authors":["li","susan"],"year":2011}

默认情况下,javascript.stringify()所输出的json 字符串不包含任何空格字符和缩进。

值为undefined的任何属性会被跳过。

  序列号选项

javascript.stringify() 函数还可以接收两个参数,第一个参数是个过滤器,可以是个数组,也可以是个函数,第二个是字符串中保留缩进。

1.过滤器

var book =
{
title:"javascript",
authors:["li","susan"],
year:2011,
edition:undefined
};
console.log(JSON.stringify(book,["title"]));

输出结果:{"title":"javascript"}

如果第二个参数是函数,传入的函数有两个参数,属性键名和键值。话不多说,直接上例子。

 var book =
{
title:"javascript",
authors:["li","susan"],
year:2011,
edition:undefined
};
console.log(JSON.stringify(book,function(key,value){ switch (key)
{
case "authors":
return value.join(",");
case "edition":
return undefined;
default :
return value;
}
}));

输出结果:{"title":"javascript","authors":"li,susan","year":2011}

2.字符串缩进

var book =
{
title:"javascript",
authors:["li","susan"],
year:2011,
edition:undefined
};
console.log(JSON.stringify(book,function(key,value){ switch (key)
{
case "authors":
return value.join(",");
case "edition":
return undefined;
default :
return value;
}
},5));

输出结果:

{
"title": "javascript",
"authors": "li,susan",
"year": 2011
}

注意:最大缩进空格数为10 ,大于10 自动转换为10缩进。

2.toJSON 方法

 var book =
{
title:"javascript",
authors:["li","susan"],
year:2011,
edition:undefined,
toJSON :function()
{
return this.title;
}
};

输出结果:"javascript"

有时候如果JSON.stringify()还无法满足序列化需求,可以通过对象上调用toJSON()方法,返回其自身的JSON数据格式。

toJSON()函数可以作为过滤器的补充。

把一个对象传入JSON.stringify(),序列化顺序如下

1.如果存在toJSON()方法,而且通过它可以取到有效值,则先调用它。否则,按照默认顺序执行序列化

2.如果提供第二个参数,执行该过滤器,传入过滤器的值是第一步的返回值

3.对第二步返回的值进行相应的序列化

4.如果提供了第三个参数,执行的相应的格式化

JSON.parse();

json.parse() 也可以接收另一个参数,该参数也是一个函数。

 var book =
{
title:"javascript",
authors:["li","susan"],
year:2011,
edition:undefined,
releaseDate:new Date(2011,1,1) };
var jsonText = JSON.stringify(book);
var bookcopy = JSON.parse(jsonText,function(key,value){
if(key=="releaseDate")
{
return new Date();
}else
{
return value;
}
})
console.log(bookcopy.releaseDate.getFullYear());

输出结果:2016

JSON数据理解的更多相关文章

  1. 关于跨域读取json数据我的理解

    这两天在做关于读取json数据的插件,想用getJSON读取数据: $.getJSON(http://www.xxxx.com/Titles.js, function (data) { console ...

  2. 彻底理解使用JavaScript 将Json数据导出CSV文件

    前言 将数据报表导出,是web数据报告展示常用的附带功能.通常这种功能都是用后端开发人员编写的.今天我们主要讲的是直接通过前端js将数据导出Excel的CSV格式的文件. 原理 首先在本地用Excel ...

  3. 跨域获取json一些理解[腾讯电商数据的拉取方式]

    如何跨域获取json数据源?我们都知道要有callback,具体callback是如何工作的呢?如果服务器端不接收callback,我们是不是就没有办法处理了呢?读完本文后相信你会有一个大体的了解. ...

  4. 深入了解Struts2返回JSON数据的原理

    首先来看一下JSON官方对于"JSON"的解释: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析 ...

  5. JSON数据解析 基础知识及链接收集

    JSON数据解析学习 JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法.类似 XML.但是JSON 比 ...

  6. Json数据的学习

    JSON 教程 <body><h2>JSON Object Creation in JavaScript</h2> <p>Name: <span ...

  7. AJAX 跨域请求 - JSONP获取JSON数据

    Asynchronous JavaScript and XML (Ajax ) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术.Ajax 允许在不干扰 Web 应用程序的显示 ...

  8. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  9. 【转】Jquery ajax方法解析返回的json数据

    转自http://blog.csdn.net/haiqiao_2010/article/details/12653555 最近在用jQuery的ajax方法传递接收json数据时发现一个问题,那就是返 ...

随机推荐

  1. Tcp服务端判断客户端是否断开连接

    今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的.好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链 ...

  2. 中断——中断描述符表的定义和初始化(一) (基于3.16-rc4)

    1.中断描述符表的定义(arch/x86/kernel/traps.c) gate_desc debug_idt_table[NR_VECTORS] __page_aligned_bss; 定义的描述 ...

  3. Hadoop MapReduce概念学习系列之mr程序详谈(二十三)

    这个暂时,没写好. K1,v1 这是增强的for循环. for(Sting w : words) { } 迭代器里,前面,放的是什么类型,后面,迭代的是谁.

  4. linux shell-syntax error near unexpected token错误

    在windows下用记事本编写linux shell脚本后,执行遇到syntax error near unexpected token错误 问题原理:网上找了好久,找到原因,原来是回行的问题,每个系 ...

  5. SaltStack管理从这里开始

    Modules 1:查看所有module列表: salt 'jcfx-4' sys.list_modules jcfx-4: - acl - aliases - alternatives - apac ...

  6. 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程

    这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...

  7. c++中类长度解析

    通常我们定义一个类,它所占的空间有多大呢? 首先我们看一下下面的这个类 class A{ public: void func1(void){ printf("11111heihei\n&qu ...

  8. iOS开发-布局基础

    今天我学习了有关布局的知识,以下是我整理出来的需要注意的,也是我个人认为比较重要的细节. 一.自动约束 在我们设置好自动约束布局之后,有时会出现拖动滑动条,左边的Label会跟着放大缩小的问题. 这时 ...

  9. centos 卸载自带的 java

    一般情况下,我们都要将linux自带的OPENJDK卸载掉,然后安装SUN的JDK 首先:查看Linux自带的JDK是否已安装     <1># java -version        ...

  10. 关于PKCS5Padding与PKCS7Padding的区别

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...