首页 > 其他分享 >第三十二章 JSON

第三十二章 JSON

时间:2023-04-26 16:41:16浏览次数:32  
标签:box name age json JSON var 第三十二章


学习要点:
1.JSON 语法
2.解析和序列化

前两章我们探讨了 XML 的结构化数据, 但开发人员还是觉得这种微型的数据结构还是过于烦琐、冗长。为了解决这个问题,JSON 的结构化数据出现了。JSON 是 JavaScript 的一个严格的子集,利用 JavaScript 中的一些模式来表示结构化数据。
一.JSON 语法
JSON 和 XML 类型,都是一种结构化的数据表示方式。所以,JSON 并不是 JavaScript独有的数据格式,其他很多语言都可以对 JSON 进行解析和序列化。
JSON 的语法可以表示三种类型的值:
1.简单值: 可以在 JSON 中表示字符串、 数值、 布尔值和 null。 但 JSON 不支持 JavaScript中的特殊值 undefined。
2.对象:顾名思义。
3.数组:顾名思义。
简单值
100、"Lee" 这两个量就是 JSON 的表示方法, 一个是 JSON 数值, 一个是 JSON 字符串。
布尔值和 null 也是有效的形式。但实际运用中要结合对象或数组。
对象
JavaScript 对象字面量表示法:



var box = {
name : 'Lee',
age : 100
};



 
而 JSON 中的对象表示法需要加上双引号,并且不存在赋值运算和分号:



{
"name" : "Lee", //使用双引号,否则转换会出错
"age" : 100
}


 
数组
JavaScript 数组字面量表示法:



var box = [100, 'Lee', true];



 
而 JSON 中的数组表示法同样没有变量赋值和分号:



[100, "Lee", true]
一般比较常用的一种复杂形式是数组结合对象的形式:
[
{
"title" : "a",
"num" : 1
},
{
"title" : "b",
"num" : 2
},
{
"title" : "c",
"num" : 3
}
]



 

PS:一般情况下,我们可以把 JSON 结构数据保存到一个文本文件里,然后通过XMLHttpRequest 对象去加载它,得到这串结构数据字符串(XMLHttpRequest 对象将在 Aajx章节中详细探讨)。所以,我们可以模拟这种过程。
模拟加载 JSON 文本文件的数据,并且赋值给变量。



var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';



 
PS; 上面这短代码模拟了 var box = load('demo.json');赋值过程。 因为通过 load 加载的文本文件,不管内容是什么,都必须是字符串。所以两边要加上双引号。
其实 JSON 就是比普通数组多了两边的双引号,普通数组如下:


var box = [{name : 'a', age : 1},{name : 'b', age : 2}];


 
二.解析和序列化
如果是载入的 JSON 文件, 我们需要对其进行使用, 那么就必须对 JSON 字符串解析成原生的 JavaScript 值。当然,如果是原生的 JavaScript 对象或数组,也可以转换成 JSON 字符串。
对于讲 JSON 字符串解析为 JavaScript 原生值,早期采用的是 eval()函数。但这种方法既不安全,可能会执行一些恶意代码。



var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';
alert(box); //JSON 字符串
var json = eval(box); //使用 eval()函数解析
alert(json); //得到 JavaScript 原生值


 
ECMAScript5 对解析 JSON 的行为进行规范,定义了全局对象 JSON。支持这个对象的浏览器有 IE8+、 Firefox3.5+、Safari4+、Chrome 和 Opera10.5+。不支持的浏览器也可以通过一个开源库 json.js 来模拟执行。JSON 对象提供了两个方法,一个是将原生 JavaScript 值转换为 JSON 字符串:stringify();另一个是将 JSON 字符串转换为 JavaScript 原生值:parse()。



var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]'; //特别注意,键要用双引号
alert(box);
var json = JSON.parse(box); //不是双引号,会报错
alert(json);
var box = [{name : 'a', age : 1},{name : 'b', age : 2}]; //JavaScript 原生值
var json = JSON.stringify(box); //转换成 JSON 字符串
alert(json); //自动双引号



 
在序列化 JSON 的过程中, stringify()方法还提供了第二个参数。 第一个参数可以是一个数组, 也可以是一个函数, 用于过滤结果。 第二个参数则表示是否在 JSON 字符串中保留缩进。



var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}];
var json = JSON.stringify(box, ['name', 'age'], 4);
alert(json);



 
PS:如果不需要保留缩进,则不填即可;如果不需要过滤结果,但又要保留缩进,则讲过滤结果的参数设置为 null。如果采用函数,可以进行复杂的过滤。



var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}];
var json = JSON.stringify(box, function (key, value) {
switch (key) {
case 'name' :
return 'Mr. ' + value;
case 'age' :
return value + '岁';
default :
return value;
}
}, 4);
alert(json);



 
PS:保留缩进除了是普通的数字,也可以是字符。
还有一种方法可以自定义过滤一些数据,使用 toJSON()方法,可以将某一组对象里指定返回某个值。



var box = [{name : 'a', age : 1, height : 177, toJSON : function () {
return this.name;
}},{name : 'b',age : 2, height : 188, toJSON : function () {
return this.name;
}}];
var json = JSON.stringify(box);
alert(json);



 
PS:由此可见序列化也有执行顺序,首先先执行 toJSON()方法;如果应用了第二个过滤参数,则执行这个方法;然后执行序列化过程,比如将键值对组成合法的 JSON 字符串,比如加上双引号。如果提供了缩进,再执行缩进操作。
解析 JSON 字符串方法 parse()也可以接受第二个参数,这样可以在还原出 JavaScript 值的时候替换成自己想要的值。



var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';
var json = JSON.parse(box, function (key, value) {
if (key == 'name') {
return 'Mr. ' + value;
} else {
return value;
}
});
alert(json[0].name);



 

标签:box,name,age,json,JSON,var,第三十二章
From: https://blog.51cto.com/u_16089934/6228107

相关文章

  • JSON View谷歌浏览器插件使用
    JSONVIewer:sourcecode:https://github.com/tulios/json-viewer谷歌浏览器插件,用于展示JSON、JSONP格式的代码文件。网页显示效果如下:插件主要参数修改:font-size:字体大小;line-height:行高。官网介绍:ThemostbeautifulandcustomizableJSON/JSONPhighlighterthatyou......
  • Django之视图函数层 (必会三板斧 JsonResponse对象 request对象获取文件 FBV与CBV
    目录视图层之必会三板斧用来处理请求的视图函数都必须返回HttpResponse对象情况一:啥也不返回这里会报一个没有返回HttpResponse对象的错误,由此可见必须要返回一个HttpResponse对象情况二:返回HttpResponse对象点击Ctrl键查看源码可见是HttpResponse类,所以会返回一个值情......
  • okhttp3的基本使用(post发送json示例)
    依赖<!--https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><ve......
  • spring mvc3.2 requestbody json显示原理
    1,publicinterfaceHandlerMethodReturnValueHandler{ /** *Whetherthegiven{@linkplainMethodParametermethodreturntype}is *supportedbythishandler. * *@paramreturnTypethemethodreturntypetocheck *@return{@codetrue}ifthis......
  • Django框架——路由分发、名称空间、虚拟环境、视图层三板斧、JsonResponse对象、requ
    路由分发#Django支持每个应用都可以有自己独立的路由层、静态文件、模版层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起多个应用都有很多路由与视图函数的对应关系这个时候可以拆分到各自的路由层中使用路由分发之前总路由直接是路由与视图......
  • 【Python】操作复杂嵌套的json数据
    1、相关文章递归获取所有key-value值:https://www.cnblogs.com/phoenixy/p/17126455.html 2、对复杂的json进行增删改查①获取数据#-*-coding:UTF-8-*-importjsonfromjsonpath_ngimportparsefromaa_demo.base.loggerimport*classjson_labor_tools:......
  • js字符串与json对象处理
    直接上代码:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>点绘制济南省</title></head><bodystyle="margin:0;overflow:hidden;background:#fff;width:100%;height:100%;position:absolu......
  • Swift Codable协议实战:快速、简单、高效地完成JSON和Model转换!
    前言Codable是Swift4.0引入的一种协议,它是一个组合协议,由Decodable和Encodable两个协议组成。它的作用是将模型对象转换为JSON或者是其它的数据格式,也可以反过来将JSON数据转换为模型对象。Encodable和Decodable分别定义了encode(to:)和init(from:)两个协议......
  • Python学习笔记--json序列化时间报错-改源码
    问题:转换时间报错执行代码为:importjsonfromdatetimeimportdate,datetimed={"time1":date.today(),"time2":datetime.today()}res=json.dumps(d)#报错  TypeError:ObjectoftypedateisnotJSONserializable方案1:手动转换str()方案2:继承类......
  • UE4 构造Json
    先记录:格式一:数组嵌套 实现1FStringGenerateJson(constFStringMsg)2{3TSharedPtr<FJsonObject>RootJsonObj=MakeShareable<FJsonObject>(newFJsonObject);4RootJsonObj->SetStringField(TEXT("prompt"),Msg);56TAr......