JSON文件

JSON是JavaScript的一个严格的子集,利用JavaScript中的一些模式来表示结构化数据。
JSON是一种结构化的数据表示方式。所以,JSON并不是JavaScript独有的数据格式,
其他很多语言都可以对JSON进行解析和序列化。
JSON的语法可以表示三种类型的值:
1.简单值:可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持JavaScript中的特殊值undefined。
2.对象:顾名思义。
数组:顾名思义。
一、简单值:
18,"wxx"这两个量就是JSON的表示方法100、一个是JSON数值,一个是JSON字符串。布尔值和null也是有效的形式。但实际运用中要结合对象或数组。
二、对象:
JavaScript对象字面量表示法:
var box = {
name : ‘wxx‘,
age : 18
};
而JSON中的对象表示法需要加上双引号,并且不存在赋值运算和分号:
{
"name" : "wxx", //使用双引号,否则转换会出错
"age" : 18
}
//Json说白了就是一个字符串,所以任何表示,都应该加上引号表示字符串
三、数组
JavaScript数组字面量表示法:
var box = [18, ‘wxx‘, true];

而JSON中的数组表示法同样没有变量赋值和分号:
[18, ‘wxx‘, true];
//Json对象和数组比普通对象和数组,少了分号,少了变量赋值,而且本身应该是字符串表示
一般比较常用的一种复杂形式是数组结合对象的形式:
[
{
"title" : "a",
"number" : 1
},
{
"title" : "b",
"number" : 2
},
{
"title" : "c",
"number" : 3
}
]
一般情况下,我们可以把JSON结构数据保存到一个文本文件里,然后通过XMLHttpRequest对象去加载它,得到这串结构数据字符串。所以,我们可以模拟这种过程。

模拟加载JSON文本文件的数据,并且赋值给变量。
var box = ‘[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]‘;
上面这短代码模拟了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);
如果不需要保留缩进,则不填即可;如果不需要过滤结果,但又要保留缩进,则讲过滤结果的参数设置为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);

//火狐3.5和3.6在最初支持JSON的之后,Stringfy方法有个小bug,执行function会出错
保留缩进除了是普通的数字,也可以是字符。

还有一种方法可以自定义过滤一些数据,使用toJSON()方法,可以将某一组对象里指定返回某个值。

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

由此可见序列化也有执行顺序,首先先执行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);

时间: 2024-10-08 13:55:53

JSON文件的相关文章

Json.NET读取和写入Json文件

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using System.Text; using Newtonsoft.Json; using com.zjpx.model; using System.Collections; usin

vc中json文件的读取、修改和添加字段的方法

前言: 本代码涉及到对json文件的读取.修改和添加方法 WTL中radir button的状态判断和设置可选以及取消可选 示例: 所需头文件: #include <json.h> #include <file_io.h> 代码部分: //读取下载线路在界面上的radir button中显示 void CMainDlg::read_download_line_from_cfg() { std_string strDownloadLine; file_io<> json_

Python 基础 - Json文件读写

JSON介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). 在python中,JSON 由列表和字典组成. 序列化的两个模块中,json模块是用于

用angular引入复杂的json文件

我们在写网页时是有很多的重复代码和重复样式的,我们也不能一口气敲下来,这样就成为了体力劳动了. 所以我在遇到这种情况的时候大部分是用angular来获取json的,而用angular来让json数据库中的数据导入到网页中是让我们不用重复的书写重复的代码. 但是一些子元素较少的还比较好整,但是象下拉列表就比较麻烦了.不止写json文件比较麻烦,连获取json都变的复杂啦. 比如说我们在写一个这样的json文件时 "recruit":[ {"name":"1&

vue.js学习笔记(二):如何加载本地json文件

在项目开发的过程中,因为无法和后台的数据做交互,所以我们可以自建一个假数据文件(如data.json)到项目文件夹中,这样我们就可以模仿后台的数据进行开发.但是,如何在一个vue.js 项目中引入本地的json文件呢,下面就将步骤贴出来.(此时项目是由webpack打包而成). 整个项目是由webpack打包而成,具体步骤上网查找.具体项目结构如下: 1:我们找到bulid>dev-server.js,然后打开 2:在里面加入这段代码. var app = express() var appDa

Failed: error processing document #281: unexpected EOF,往MongoDB当中插入json文件时出现的错误。

往MongoDB当中插入json文件时提示的错误(我的操作系统是win10): 当时的执行命令是:mongoimport -d test -c restaurants d://primer-dataset.json 之后将 primer-dataset.json文件存入文件夹当中就可以成功插入了,执行命令为:mongoimport -d test -c restaurants d://mongoDB/primer-dataset.json 成功提示如下: 个人感觉是应该是路径选择出现的问题,我把

scrapy抓取到中文,保存到json文件为unicode,如何解决.

http://scrapy-chs.readthedocs.org/zh_CN/latest/intro/overview.html 以上链接是很好的scrapy学些资料.感谢marchtea的翻译. 在学习过程中,碰到一个很棘手的问题: 中文的显示和存储. (中文在控制台显示的为\u77e5\u540d...这样的字符,保存到文件也是这样的) 在网上找了很久,下面这个链接应是最切题的. http://stackoverflow.com/questions/9181214/scrapy-text

python解析json文件

概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象. JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集. Python2.6开始加入了JSON模块,无需另外下载,Python的Json模

ubuntu下查看json文件(带缩进)

使用cat命令查看json文件是不带缩进的: cat repositories-aufs {"Repositories":{"kiwenlau/registry":{"2.0.1":"b4a1d983836039925cca8732712632e03b38a91d156ad65dd8513f0ede7b780a"}}} 如果想要显示缩进,可以这样(需要安装python 2.6+): cat repositories-aufs

cocos2dx 3.X 中 json 文件生成与读取

Cocos2d-x 3.0 加入了rapidjson库用于json解析.位于项目的cocos2d/external/json下. rapidjson 是一个不需要包含 .lib 和 .dll 即可运行的可见代码库.项目 wiki 见这里.下面通过两个实例来深入了解它在 cocos2dx 中的用法. 生成JSON文件并保存 #include "CCStdC.h" #include "cocos2d.h" #include "json/document.h&q