关于JSON的那些事儿

时间:2021-08-11 11:32:33

JSON的那些事儿

曾经有一段时间,XML是互联网上传输结构化数据的事实标准,其突出特点是服务器与服务器间的通信。但是业内不少人认为XML过于繁琐、冗长,后面为了解决这个问题也出现了一些方案,但是由于其结构很严格,这些问题还是不能从根本上得到解决。随着Web的不断发展,慢慢的出现了一种轻量级的数据格式——JSON,它的出现受到很多编程人员的喜爱,这篇文章主要讲关于JSON的那些事。

  (注:这边文章主要讨论的是javascript中的JSON操作,故很多东西只是针对Javascript来说)

【JSON的历史】

  JSON的全称:JavaScript Object Notation,翻译过来的意思是Javascript对象表示法。它基于JavaScript Programming Language,Standard ECMA-262 3rd Edition - December 1999的一个子集,作为一种轻量级的数据交换格式,JSON早在2000年前就已经在使用了。2006年Douglas Crockford把JSON提交给IETF后,JSON开始作为Javascript的一个严格的子集,它用Javascript中的一些模式来表示结构化数据。而在Javascript中,JSON无疑是更好的读写结构化数据的方式。

【JSON的特点】

  1、JSON是一种轻量级的数据交换格式(不是一种编程语言);

  2、JSON是存储和交换文本信息的语法,类似于XML,采用键值对的方式来组织,从而易于阅读和编写,同时也易于机器解析和生成;

  3、JSON采用与编程语言无关的文本格式,但是也使用了类C语言(包括C,C++,C#,Java,JavaScript,Perl,Python等)的习惯,这些特性使JSON成为理想的数据交换格式(独立于语言,很多编程语言都能解析JSON,只要按JSON的规则就行了);

  4、JSON可以用Javascript内建的方法直接进行解析,从而转换成Javascript也非常方便

【JSON的优点】

  1、基于纯文本,跨平台传递极其简单;

  2、Javascript原生支持,后台语言几乎全部支持;

  3、轻量级数据格式,占用 字符数量极少,特别适合互联网传递;

  4、可读性较强,虽然比不上XML那么一目了然,但在合理的依次缩进之后还是很容易识别的;

  5、容易编写和解析,当然前提是你要知道数据结构。

【JSON的语法】

  JSON的语法可以表示以下三种类型的值:

    *对象:与Javascript类似(后面会有详细介绍)。

    *数组:与Javascript类似(后面会有详细介绍)。

    *简单值:使用与Javascript相同的语法,可以在JSON中表示字符串、数值、布尔值和null,但是JSON不支持undefined。

  [对象]

    规则:对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

    图像表示,如图:关于JSON的那些事儿

    示例:{"name":"foodoir","age":21}

    与Javascript的比较:

      在Javascript中的写法(对象的面向字面量写法):var obj = {"name":"foodoir","age":21};或是var obj = {name:"foodoir",age:21};

    与Javascript的区别:

      1、JSON中没有变量声明(JSON中没有变量这个概念);

      2、JSON中没有末尾的分号;

      3、JSON的属性上面要加双引号,而Javascript中可加可不加;

    注意事项:

      1、同一个对象中绝对不应该出现两个同名属性(父对象和子对象中的属性可以同名)!

      2、属性的值可以是简单的值,也可以是复杂的值(比如说在对象中嵌入对象)!

      3、最后一个属性的后面不应有逗号,否则会报错!

      4、复杂的值可以是数字、字符串、布尔值、对象、数组和null(没有undefined和函数)

    代码示例:

{
"name": 'foodoir',
"age": 21,
"school":{
"name":"XXX College",
"location":"Hunan"
}
//属性的值可以是复杂的类型
}
//虽然说有两个name,但是它们分别在不同的对象中 /*比较最后多一个逗号的效果*/
{
"name": 'foodoir',
"age": 21, //注意,这里多了一个逗号
}
//在JSON中直接导致语法错误 var obj = {
"name": 'foodoir',
"age": 21, //注意,这里多了一个逗号
};
//在标准浏览器、IE8+ 中,都能正常的执行,但在IE6、7中,却会报错

    

  [数组]

    规则:数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

    图像表示,如图:关于JSON的那些事儿

    示例:["foodoir",21,true]

    与Javascript的比较:

      在Javascript中的写法(数组的面向字面量写法):var arr = ["foodoir",21,true];

    与Javascript的区别:

      JSON中的数组和Javascript中的数组基本一致

    注意事项:

      1、数组可以和对象结合起来,构成更复杂的数据集合

      2、在JSON中最后一个属性的后面不应有逗号,否则会报错!

      3、数组中间可以是数字、字符串、布尔值、对象、数组和null(没有undefined和函数)

    代码示例:

[
{
"title":"HTML",
"authors":{
"foodoir.H"
},
"year":2001
}
{
"title":"CSS",
"authors":{
"foodoir.C"
},
"year":2002
}
{
"title":"JAVASCRIPT",
"authors":{
"foodoir.J"
},
"year":2003
}
]
//多个数组和对象的结合,形成了更复杂的数据集合 ['sheep', 'cat', 'dog',]//多了一个逗号
//在JSON中直接导致语法错误
var animal = ['sheep', 'cat', 'dog',];//同样多了一个逗号
//在浏览器中不会报错,但是,确会有个很严重的问题。IE6、7、8中会认为animal.length等于4,其中的元素为 'sheep', 'cat', 'dog', undefined

  [简单值]

    规则:值(value)可以是双引号括起来的字符串(string)、数值(number)、布尔值(true/false)、 null、对象(object)或者数组(array),只能是这七种类型。这些结构可以嵌套。

    图像表示,如图:

关于JSON的那些事儿

    示例:"foodoir" 25 true false null {"name":"foodoir"} [1,2,3]

    与Javascript的比较:

      与Javascript中的写法基本一致

    与Javascript的区别:

      (略……)

    注意事项:

      1、JSON不支持Javascript中特殊的值undefined

      2、JSON也不支持Javascript中的function

  对于简单值中间的字符串(string)和数值(number)有必要拿出来单独提一提。

  [字符串]

    规则:字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

    图像表示,如图:关于JSON的那些事儿

    示例:{"string":"true \" false"}

    与Javascript的比较:

      在Javascript中的正则表达式(RegExp)比较相似

    注意事项:

      1、英文双引号括起来,不能用单引号,也不能没有;

      2、字符串中不能单独出现双引号(”) 和右斜杠(“\”);

      3、如果要打双引号或右斜杠,需要使用“右斜杠+字符”的形式,例如 \” 和 \\其它转移字符也是如此

      4、支持任何UNICODE字符。

    在这里,推荐一个比较好用的检验JSON格式的网址:http://www.json.cn

    我们可以在线检验我们的JSON,并且在右边区域会有相应的错误的提示。这样更方便我们对于JSON的使用。

关于JSON的那些事儿

  [数字]

    规则:数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

    图像表示,如图:关于JSON的那些事儿

    示例:1 2.01 -200 3e4 3e-4

    与Javascript的比较:

      JSON中不支持八进制和十六进制格式,而在Javascript中能很好的支持。

    注意事项:

      八进制和十六进制

    同样,我们也可以用之前的工具来检测我们的JSON代码。

关于JSON的那些事儿

关于JSON的那些事儿

到这里,JSON的基本语法都讲的差不多了,后面我们将继续介绍字符串和对象间的转化、JSON和XML的转换、Ajax和JSON、以及GeoJSON和TopoJSON。

--------------------------------------------------分界线--------------------------------------------------------------------

如果你想了解更多关于JSON的,请继续往下看

【字符串和对象间的转换】

[ 解析 ]

  将符合 JSON 语法规则的字符串转换成对象的过程叫做解析

  不同的编程语言都提供了解析 JSON 字符串的方法,在这里主要讲解 JavaScript 中的解析方法。主要有三种:

    - 使用 eval()

    - 使用 JSON.parse()

    - 使用第三方库,例如 JQuery 等

  下面我们来依次介绍这三种方法:

一、eval()的使用

  a) 在Javascript中,eval() 函数的参数是一个字符串,其作用是直接执行其中的 JavaScript 代码

  b) eval() 能够解析 JSON 字符串(从这里也可以看得出,JSON 和 JavaScript 是高度嵌合的)

  示例如下:

/*Javascript*/
var str = "console.log('hello world')";
eval(str);//hello world
//从这里可以看出,eval函数会直接对里面的代码执行操作 /*JSON*/
var str = '{"name": "foodoir", "age": 21}';
var result = eval ("(" + str + ")");
console.log(result);//Object age : 21 name : "foodoir" var str = '{"name": "console.log('foodoir')", "age": 21}';
var result = eval ("(" + str + ")");
console.log(result);// Uncaught SyntaxError: Unexpected identifier
//从这里可以看出,eval函数会直接对里面的代码执行操作

  注意:

    1、eval() 虽然能够解析 JSON 字符串,但是现在已经很少直接使用 eval() 来解析了,如果您的浏览器版本真的是很旧,可能才需要这个方法。此外,eval() 是一个相对危险的函数,因为字符串中可能含有未知因素。

    2、注意 eval() 的参数,在字符串两旁加了括号,这是必须的,否则会报错(原因:因为 JSON 字符串是被大括号(“{}”)包围的,直接放到 eval() 会被当成语句块)

二、JSON.parse()的使用 

  a) JSON.parse() 可以有第二个参数,是一个函数。此函数有两个参数:name 和 value,分别代表名称和值。当传入一个 JSON 字符串后,JSON 的每一组名称/值对都要调用此函数。该函数有返回值,返回值将赋值给当前的名称(name)。

  b) 利用第二个参数,可以在解析 JSON 字符串的同时对数据进行一些处理

  示例如下:

var str = '{"name": "foodoir", "age": 21}';
var obj = JSON.parse(str, fun);
function fun(name, value){
if( name == "age" )
value = 14;
return value;
}
console.log(obj);//Object {name: "foodoir", age: 14}

  注意:

    1、现在绝大多数浏览器都以支持 JSON.parse(),是推荐使用的方式;

    2、如果输入了不符合规范的字符串,会报错(建议配合之前的在线测试工具一起使用)

 补充:

    为了区别JSON.stringify()接收的替换(过滤)函数,在这里出现了一种还原函数(接收两个参数,一个键和一个值,并且返回一个值)。如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。代码示例如下:

var book = {
"title":"HTML",
"authors":[
"foodoir.H"
],
year:2001,
releaseDate:new Date(2016,9,22)//先为book对象增加一个releaseDate属性,该属性保存着Date对象
}; var jsonText = JSON.stringify(book);//经过序列化后变成有效的JSON字符串 var bookCopy = JSON.parse(jsonText,function(key,value){//在bookCopy中将JSON字符串解析为Date对象
if(key == "releaseDate"){
return new Date(value);
}else{
return value;
}
});
//结果就是bookCopy.releaseDate属性中保存了一个Date对象,然后后面才能基于Date对象调用getFullYear方法
alert(bookCopy.releaseDate.getFullYear());

  综合练习:

var json = '{"staff":[{"name":"foodoir","age":21},{"name":"jake","age":22},{"name":"rooce","age":23}]}';
var jsonobj = eval('('+json+')');
alert(jsonobj.staff[0].name);//foodoir var jsondata = '{"staff":[{"name":"foodoir","age":21},{"name":"jake","age":22},{"name":"rooce","age":23}]}';
var jsonobj = JSON.parse(jsondata);
alert(jsonobj.staff[0].name);//foodoir var json = '{"staff":[{"name":"foodoir","age":alert(123)},{"name":"jake","age":22},{"name":"rooce","age":23}]}';
var jsonobj = eval('('+json+')');
alert(jsonobj.staff[0].name);//先是123 后是foodoir
//eval不会管json里面是否合法,并且会执行里面的方法 var jsondata = '{"staff":[{"name":"foodoir","age":alert(123)},{"name":"jake","age":22},{"name":"rooce","age":23}]}';
var jsonobj = JSON.parse(jsondata);
alert(jsonobj.staff[0].name);//报错

三、第三方库,例如 JQuery

    在这里不做介绍,后面会有专门的博文关于jquery处理JSON的介绍。

[ 序列化 ]

  序列化,指将 JavaScript 值转化为 JSON 字符串的过程。

  JSON.stringify() 能够将 JavaScript 值转换成 JSON 字符串。JSON.stringify() 生成的字符串可以用 JSON.parse() 再还原成 JavaScript 值。

  表示方法:

    JSON.stringify(value[, replacer[, space]])

  参数的含义:

    value:必选参数。被变换的 JavaScript 值,一般是对象或数组。

    replacer:可以省略。有两种选择:函数或数组。

        - 如果是函数,则每一组名称/值对都会调用此函数,该函数返回一个值,作为名称的值变换到结果字符串中,如果返回 undefined,则该成员被忽略。

        - 如果是数组,则只有数组中存在名称才能够被转换,且转换后顺序与数组中的值保持一致。

    space:可以省略。这是为了排版、方便阅读而存在的。可以在 JSON 字符串中添加空白或制表符等。

  代码示例:

var obj = {
name:"foodoir",
age:21,
t:true,
f:false,
n:null,
u:undefined,
f:function(){
return 1;
},
arr:[function(){}]
};
console.log(obj); var jsonstr = JSON.stringify(obj);
console.log(jsonstr);

  结果显示:关于JSON的那些事儿

  当传入的参数不同时,所控制的结果也会不同,下面我们介绍两种在不同参数的情况下结果存在的变化。

  1、 过滤结果

    如果过滤器参数是数组,那么JSON.stringify()的结果中将只包含数组中列出的属性;如果第二个参数是函数,行为会稍有不同,下面我们直接看下面的例子:

var book = {
"title":"Javascript",
"authors":[
"foodoir JavaScript"
],
edition:3,
year:2001
}; var jsonText1 = JSON.stringify(book,["title","edition"]);
console.log(jsonText1);//{"title":"Javascript","edition":3}
//结果分析:数组中只包含两个字符串:"title"和"edition",故在结果中序列化的对象中的属性是对应的 var jsonText2 = JSON.stringify(book,function(key,value){
switch(key){
case "authors":
return value.join(",");//返回值将数组连接为字符串
case "year":
return 5000;//返回值为5000
case "edition":
return undefined;//返回值为undefined,直接跳过
default:
return value;//
}
});
console.log(jsonText2);//{"title":"Javascript","authors":"foodoir JavaScript","year":5000}
//结果分析:在这里,函数过滤器根据传入的键来决定结果,比如键为"year",其返回值为5000

  2、 字符串缩进

    JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数,当然,我们还可以制表符或者短划线来控制缩进。我们直接看下面的例子:

var book = {
"title":"Javascript",
"authors":[
"foodoir JavaScript"
],
edition:3,
year:2001
}; var jsonText1 = JSON.stringify(book,null,4);
console.log(jsonText1); var jsonText2 = JSON.stringify(book,null,"------");
console.log(jsonText2);

  结果显示:关于JSON的那些事儿

  注意:缩进字符最长不能超过10个字符长,如果字符长度超过了10个,结果中只出现前10个字符。 

[扩充]

  在这里,我们还要介绍一种方法:toJSON()方法

    有时候,我们并不能满足JSON.stringify()方法对某些对象进行自定义化的需求,这时我们可以给对象定义toJSON()方法,返回其自身的JSON数据格式。代码示例如下:

var book = {
"title":"Javascript",
"authors":[
"foodoir JavaScript"
],
edition:3,
year:2001,
toJSON:function(){
return this.title;
}
}; var jsonText1 = JSON.stringify(book,null,4);
console.log(jsonText1);//Javascript var jsonText2 = JSON.stringify(book,null,"------");
console.log(jsonText2);//Javascript

    这两种方法返回的都是Javascript,其原因在于:toJSON方法返回的是图书的书名(this.title=》book.title)。还可以让toJSON方法返回任何值,它都能正常工作。从而toJSON方法可以作为函数过滤器的补充。假设把一个对象传入JSON.stringify(),序列化该对象的顺序如下:

  1、如果存在toJSON方法而且能通过它取到有效值,则调用该方法;否则,返回对象本身;

  2、如果提供了第二个参数,应该用这个函数过滤器。传入函数过滤器的值是第1步返回的值;

  3、对第2步返回的每个值进行相应的序列化;

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

【JSON和XML的转换】

  尽管JSON和XML中有很多相似之处,但是它们之间想要转化是非常复杂的,这时候我们就需要框架和组件来帮忙了。在对JSON和XML进行转换之前,我们需要在网上下载这三个资源。一个需要在jquery官网下载一个稳定的jquery版本,然后需要在前面介绍的www.json.cn里面下载两个文件jquery.json2xml.js 和 jquery.xml2json.js (右侧点击JSON组件,查找后便可下载)。有了工具后,二者间的转化将会变得很简单。(关于XML我们这里不做专门的介绍,可以自己在网上查阅相关资料)

  XML 字符串转换成 JSON 对象
    关键代码:$.xml2json(str);

    需要注意的是:我们可以用前面的方法对我们的结果进行操作。
  JSON 对象转换成 XML 字符串
    关键代码:$.json2xml(obj);

  示例代码如下:

<script src="jquery-2.1.4.min.js"></script>
<script src="jquery.xml2json.js"></script>
<script src="jquery.json2xml.js"></script>
<script type="text/javascript">
var str = "<root>" +
"<name>Gfoodoir</name>" +
"<age>21</age>" +
"<friends>HTML</friends>" +
"<friends>CSS</friends>" +
"<friends>JAVASCRIPT</friends>" +
"</root>"; console.log(str);//输出的结果为字符串 var obj = $.xml2json(str);
console.log(obj);//输出的是Javascript对象 var jsonstr = JSON.stringify(obj);
console.log(jsonstr);//输出的是JSON字符串 var person = {
name: "foodoir",
age: 21,
mother: {
name: "HTML",
age: 22
},
a: function(){
return 1;
},
b: null,
c: undefined
}; var xmlstr = $.json2xml(person);
console.log(xmlstr);//输出的是XML格式 </script>

  控台输出结果:关于JSON的那些事儿

【Ajax和JSON】

JSON 文件被放置在服务器端,客户端请求该文件用得最多的是 Ajax,能够实现异步请求。

  1. Ajax 是什么
    AJAX,全称 Asynchronous JavaScript and XML,即“异步的 JavaScript 和 XML”,一般写作 Ajax。
    Ajax 能够与服务器交换少量数据,从而异步地更新部分网页。
    异步,指的是当 Ajax 执行交换数据的操作时,其他的操作仍然可以执行。
    一个最常见的应用是:打开百度或谷歌首页,当输入文字后,搜索栏下方会显示出几个建议的搜索词。这正是 Ajax 的应用。

  2. 创建和使用 Ajax
    创建 Ajax 对象要考虑浏览器的版本问题,主要分为两大类:IE7+/Chrome/Firefox/… 和 IE6/IE5.。
    function CreateXHR(){
        if (window.XMLHttpRequest)
        {
            //对浏览器 IE7+, Firefox, Chrome, Opera, Safari
            return new XMLHttpRequest();
        }
        else
        {
            //对浏览器 IE6, IE5
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
    }

    然后,只要用如下方式创建即可。
    var xmlhttp;
    xmlhttp = CreateXHR();
    服务器端有一个文件 test.json,请求并输出。
    xmlhttp.open("GET","test.json",true);
    xmlhttp.send();
    xmlhttp.onreadystatechange = function(){
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
            var jsonstr = xmlhttp.responseText;
            console.log(jsonstr);
        }
    }

  其中,xmlhttp.readyState 存有 XMLHttpRequest 的状态,有五个值:

    0: 请求未初始化
    1: 服务器连接已建立
    2: 请求已接收
    3: 请求处理中
    4: 请求已完成,且响应已就绪

  xmlhttp.status 的值为请求结果,200 表示“OK”,404 表示未找到页面。
  获取来自服务器的响应,可使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性,前者是以字符串形式,后者是以 XML 形式。

  完整代码如下:

/*HTML代码*/
<script>
var xmlhttp;
xmlhttp = CreateXHR();
xmlhttp.open("GET","test.xml",true);
xmlhttp.send();
xmlhttp.onreadystatechange = function(){
if( xmlhttp.readyState == 4 && xmlhttp.status == 200 ){
var xmlroot = xmlhttp.responseXML;
console.log(xmlroot);
var friends = xmlroot.getElementsByTagName("friends");
console.log(friends);
}
} function CreateXHR(){
if(window.XMLHttpRequest){
// IE7++, Chrome, Firefox, ..
return new XMLHttpRequest();
}else{
// IE6, IE5
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
</script> /*JSON文件中的代码*/
{
"name": "foodoir",
"age": 21,
"friends": ["HTML", "CSS", "Javascript"]
} /*XML文件中的代码*/
<root>
<name>foodoir</name>
<age>21</age>
<friends>HTML</friends>
<friends>CSS</friends>
<friends>javascript</friends>
</root>

  在同一个文件夹中如下命名:关于JSON的那些事儿

  控制台结果为:关于JSON的那些事儿

  因为这篇文章主要讲JSON,我们对于AJAX就不做详细介绍了。

【GeoJSON和TopoJSON】

  GeoJSON 和 TopoJSON 是符合 JSON 语法规则的两种数据格式,用于表示地理信息。

1. GeoJSON

  GeoJSON 是用于描述地理空间信息的数据格式。GeoJSON 不是一种新的格式,其语法规范是符合 JSON 格式的,只不过对其名称进行了规范,专门用于表示地理信息。

  GeoJSON 的最外层是一个单独的对象(object)。这个对象可表示:

    - 几何体(Geometry)。
    - 特征(Feature)。
    - 特征集合(FeatureCollection)。

  最外层的 GeoJSON 里可能包含有很多子对象,每一个 GeoJSON 对象都有一个 type 属性,表示对象的类型,type 的值必须是下面之一。

    - Point:点。
    - MultiPoint:多点。
    - LineString:线。
    - MultiLineString:多线。
    - Polygon:面。
    - MultiPolygon:多面。
    - GeometryCollection:几何体集合。
    - Feature:特征。
    - FeatureCollection:特征集合。

  下面举几个例子。

  点对象:
    {
    "type": "Point",
    "coordinates": [ 111.6, 29.65 ]
    }
关于JSON的那些事儿
  线对象:
      {
      "type": "LineString",
      "coordinates": [[111, 29 ], [112, 26 ]]
      }
关于JSON的那些事儿
  面对象:
    {
    "type": "Polygon",
    "coordinates":[[ [30, 0], [31, 0], [31, 5], [30, 5], [30, 0] ]]
    }
关于JSON的那些事儿

由以上格式可以发现,每一个对象都有一个成员变量 coordinates。如果 type 的值为 Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon 之一,则该对象必须有变量 coordinates。
如果 type 的值为 GeometryCollection(几何体集合),那么该对象必须有变量 geometries,其值是一个数组,数组的每一项都是一个 GeoJSON 的几何对象。例如:
      {
          "type": "GeometryCollection",
          "geometries": [
              {
                  "type": "Point",
                  "coordinates": [100, 40]
              },
              {
                  "type": "LineString",
                  "coordinates": [ [100, 30], [100, 35] ]
              }
          ]
      }
关于JSON的那些事儿
如果 type 的值为 Feature(特征),那么此特征对象必须包含有变量 geometry,表示几何体,geometry 的值必须是几何体对象。此特征对象还包含有一个 properties,表示特性,properties 的值可以是任意 JSON 对象或 null。例如:
      {
          "type": "Feature",
          "properties": {
             "name": "常德"
          },
          "geometry": {
              "type": "Point",
              "coordinates": [ 111.6, 29.65 ]
          }
      }
关于JSON的那些事儿
如果 type 的值为 FeatureCollection(特征集合),则该对象必须有一个名称为 features 的成员。features 的值是一个数组,数组的每一项都是一个特征对象。

2. TopoJSON

  TopoJSON 是 GeoJSON 按拓扑学编码后的扩展形式,是由 D3 的作者 Mike Bostock 制定的。相比 GeoJSON 直接使用 Polygon、Point 之类的几何体来表示图形的方法,TopoJSON 中的每一个几何体都是通过将共享边(被称为arcs)整合后组成的。

  TopoJSON 消除了冗余,文件大小缩小了 80%,因为:
      边界线只记录一次(例如广西和广东的交界线只记录一次)。
      地理坐标使用整数,不使用浮点数。
  这里我们就不再验证,自己去试验就好。

3. 在线工具
  在线生成 GeoJSON:http://geojson.io/
  简化、转换 GeoJSON 和 TopoJSON:http://mapshaper.org/

到这里,关于JSON就介绍的差不多了,后面我们来介绍JSON的遍历方法

  在JSON中,我们一般使用for/in来遍历JSON中的值,代码如下:

var json = {
"a":12,
"b":21
}
for(var il in json){
console.log(il);//a,b
console.log(json[il]);//12,21
}

  根据键值对("name":"value")的形式,我们很快便能分析出结果。

分析了JSON的众多特点,发现它和Javascript中的数据类型有很多相似的地方,但是从一开始我们就说了JSON是一种数据交换格式,那么我们该如何判断Javascript数据类型和JSON呢?参考代码(这里不做解释,相信聪明的你看完了这篇文章了一定会懂):

var parseType = function(obj) {
var type = typeof obj;
if("object" === type) {
if(obj) {
if(obj instanceof Array) {
return "array";
}
if(obj instanceof Object) {
return type;
}
var native_obj = Object.prototype.toString.call(obj);
if("[object Window]" === native_obj) {
return "object";
}
if("[object Array]" === native_obj || "number" === typeof obj.length && "undefined" !== typeof obj.splice && "undefined" !== typeof obj.propertyIsEnumerable && !obj.propertyIsEnumerable("splice")) {
return "array";
}
if("[object Function]" === native_obj || "undefined" !== typeof obj.call && "undefined" !== typeof obj.propertyIsEnumerable && !obj.propertyIsEnumerable("call")) {
return "function";
}
} else {
return "null";
}
} else if("function" === type && "undefined" === typeof obj.call) {
return "object";
}
return type;
};

作者的话:本来是在学习AJAX时关于JSON有一些疑问,后面在网上和书上查找相关方面的资料,感觉不是很完整,后面干脆自己将所看到的和理解的东西整理出来。其中有部分图片是来源于网上。看书的话请参考《Javascript高级程序设计(第3版)》中的第20章(P562-P570),另外,其中有什么错误希望看到的亲们帮我指出来,谢谢!同时也欢迎大家一起交流~~~

关于JSON的那些事儿的更多相关文章

  1. Javascript中关于cookie的那些事儿

    Javascript-cookie 什么是cookie? 指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).简单点来说就是:浏览器缓存. cookie由什 ...

  2. JSON序列化那点事儿

    JSON序列化那点事儿 序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScri ...

  3. &period;Net深入实战系列—JSON序列化那点事儿

    序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...

  4. &period;Net深入实战系列&mdash&semi;JSON序列化那点事儿

    序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...

  5. &lbrack;转&rsqb;说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

    本文转自:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临两 ...

  6. json jsonp的区别

     前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域 ...

  7. JSON和JSONP (含jQuery实例)(share)

    来源:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临两个问 ...

  8. 【转载】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

    前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可 ...

  9. 说说JSON和JSONP,也许你会豁然开朗&lpar;转&rpar;

    前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...

随机推荐

  1. winform中textbox属性Multiline&equals;true时全选

    1.文本框右键属性 => 添加KeyDown事件. 2.添加如下代码: private void txt_result_KeyDown(object sender, KeyEventArgs e ...

  2. gbk与utf-8转换

    linux: #include <iconv.h> int code_convert(char *from_charset,char *to_charset,char *inbuf,int ...

  3. &lbrack;转&rsqb;编译安装libevent,memcache,以及php的memcached扩展

    一 安装libevent 1.去官网http://libevent.org/ 下载最新源码,我用的是libevent-2.0.20-stable.tar.gz 2.解压到/usr/src目录 ,执行命 ...

  4. localStorage&comma; localforage&comma; web sql三者的比较

    最近的项目中用到了前端存储,最初选用的是localStorage,这个是html5里面新增的API,用法很简单.setItem getItem clear. 值得注意的是,localStorage中存 ...

  5. Python的下载与安装

    linux系统由于自身的需要,自带了Python,而Windows的系统就没有自带Python.本篇Blog介绍在win8.1下,安装Pathon需要注意的问题,包括常见的0x80240017.250 ...

  6. 100114G

    无耻的暴力 #include<iostream> #include<cstdio> using namespace std; int n; int main() { freop ...

  7. &lbrack;转&rsqb;10个学习Android开发的网站推荐

    本文转自:http://blog.csdn.net/i_lovefish/article/details/43950893 1. Android Developers 作为一个Android开发者,官 ...

  8. vi&sol;vim 键盘图 &amp&semi; 替换

    在VIM中进行文本替换:    1.  替换当前行中的内容:    :s/from/to/    (s即substitude)        :s/from/to/     :  将当前行中的第一个f ...

  9. phpstorm调整背景、字体颜色

    从这个网站(http://phpstorm-themes.com/)下载各类主题的xml文件, 然后将文件放到phpStorm的文件夹中,比如:C:\Users\USERNAME\.PhpStorm2 ...

  10. Matlab&colon;拟合&lpar;1&rpar;

    拟合练习: function f = curvefun(x, tdata) f = (x()*x()*x()) / (x()-x()) * ( exp(-x()*tdata)/(x()-x()) + ...