JSON文件是什么
我们知道,JSON作为一种轻量级的数据交换格式,现在被广泛应用,特别是在API层,返回数据格式基本上都是JSON。但是,JSON字符串如果过长,那在网络传输中也存在耗时的,站在性能角度我们需要合理优化JSON。
JSON优化建议
1、服务器端开启GZip压缩
主流的服务端都支持GZip压缩,对于一般的纯文本内容GZip压缩率在35%以上,这样做的好处也很明显:
减少JSON输出大小,网络传输速度更快;
节省带宽。
2、键名缩短
对于结果集而言,数据都是查询循环输出的,所以当我们把键名缩短也变相压缩了JSON文本长度。比如原本的 {"name":"张三"} 我们可以写为 {"a":"张三"}
3、JSON中的中文避免被转为Unicode编码
现在也有不少人喜欢将JSON中的汉字转为Unicode编码,此时JSON文本内容就会变得很长,如果避免汉字转码,可以控制文本长度。
以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!
本篇文章给大家带来的内容是介绍JSON是什么?怎么使用,让大家可以对JSON有一个初步的了解,知道JSON的简单用法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。
首先我们来了解一下JSON是什么?有什么用?
JSON,全称是 JavaScript Object Notation,即 JavaScript 对象标记法。它是一种基于文本(Text-Based)的轻量级(Light-Weight)开放标准,专为人类可读的(Human-Readable)数据交换而设计。程序员已经知道JSON使用的约定,包括C,C ++,Java,Python,Perl等。
总结一下:
1、JSON是一种JavaScript 对象标记法,从JavaScript脚本语言扩展而来。
2、JSON采用完全独立于语言的文本格式,但是也可以使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。
3、文件扩展名为json,统一类型标识符是publicjson,Internet Media类型是application / json。
4、JSON专为人类可读的数据交换而设计。
JSON的特点:
1、JSON是一种轻量级的基于文本的数据交换格式。
2、无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比 XML 文件更小;
3、JSON的书写十分简单,一目了然;符合JavaScript原生语法,可以由解释引擎直接处理,不用另外添加解析代码。
4、JSON与语言无关
简单来说:JSON是一种以有条理,易于访问和书写的存储信息的方法;它为我们提供了一个人类可读的数据集合,我们可以以非常合理的方式访问这些数据。
下面我们来看看JSON可以在哪使用?怎么使用?
JSON的使用
1、在编写包含浏览器扩展和网站的基于JavaScript的应用程序时使用它。
2、JSON格式用于通过网络连接序列化和传输结构化数据。
3、它主要用于在服务器和Web应用程序之间传输数据。
4、Web服务和API使用JSON格式来提供公共数据。
5、它可以与现代编程语言一起使用。
JSON的简单示例
我们通过简单示例来看看JSON的使用方法
例1:显示如何使用JSON根据主题和版本存储与书籍相关的信息。
{
"book": [
{
"id":"01",
"language": "Java",
"edition": "third",
"author": "Herbert Schildt"
},
{
"id":"07",
"language": "C++",
"edition": "second",
"author": "EBalagurusamy"
}
]}例2:在理解了上述程序后,我们将尝试另一个例子。我们将以下代码保存为jsonhtm
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSON example</title>
<script language = "javascript" >
var object1 = { "language" : "Java", "author" : "herbert schildt" };
documentwrite("<h1>JSON与JavaScript示例</h1>");
documentwrite("<br>");
documentwrite("<h3>Language = " + object1language+"</h3>");
documentwrite("<h3>Author = " + object1author+"</h3>");
var object2 = { "language" : "C++", "author" : "E-Balagurusamy" };
documentwrite("<br>");
documentwrite("<h3>Language = " + object2language+"</h3>");
documentwrite("<h3>Author = " + object2author+"</h3>");
documentwrite("<hr />");
documentwrite(" 一本可研究编程语言: " +object2language + "的书,作者 " + object2author);
documentwrite("<hr />");
</script>
</head>
<body>
</body>
</html>运行效果:
总结:
一.什么是json
json是一种取代xml的数据结构,和xml相比,它更小巧但描述能力却很强,网络传输数据使用流量更少,速度更快。
json就是一串字符串,使用下面的符号标注。
{键值对} : json对象
[{},{},{}] :json数组
"" :双引号内是属性或值
: :冒号前为键,后为值(这个值可以是基本数据类型的值,也可以是数组或对象),所以 {"age": 18} 可以理解为是一个包含age为18的json对象,而[{"age": 18},{"age": 20}]就表示包含两个对象的json数组。也可以使用{"age":[18,20]}来简化上面的json数组,这是一个拥有一个age数组的对象。
二.$ajax()方法中dataType属性的取值
$ajax()方法中dataType属性要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText在第三部分解释,并作为回调函数参数传递。可用的类型如下:
xml:返回XML文档,可用JQuery处理。
html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。
script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。
json:返回JSON数据。
jsonp:JSONP格式。使用SONP形式调用函数时,例如myurlcallback=,JQuery将自动替换后一个“”为正确的函数名,以执行回调函数。
三.Mime数据类型及response的setContentType()方法
什么是MIME类型在把输出结果传送到浏览器上的时候,浏览器必须启动适当的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header中。
例 如,架设你要传送一个Microsoft Excel文件到客户端。那么这时的MIME类型就是“application/vndms-excel”。在大多数实际情况中,这个文件然后将传送给 Execl来处理(假设我们设定Execl为处理特殊MIME类型的应用程序)。在Java中,设定MIME类型的方法是通过Response对象的ContentType属性。比如常用:responsesetContentType("text/html;charset=UTF-8")进行设置。
最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。
每个MIME类型由两部分组成,前面是数据的大类别,例如文本text、图象image等,后面定义具体的种类。
常见的MIME类型:
超文本标记语言文本 html,html text/html
普通文本 txt text/plain
RTF文本 rtf application/rtf
GIF图形 gif image/gif
JPEG图形 ipeg,jpg image/jpeg
au声音文件 au audio/basic
MIDI音乐文件 mid,midi audio/midi,audio/x-midi
RealAudio音乐文件 ra, ram audio/x-pn-realaudio
MPEG文件 mpg,mpeg video/mpeg
AVI文件 avi video/x-msvideo
GZIP文件 gz application/x-gzip
TAR文件 tar application/x-tar
客户程序从服务器上接收数据的时候,它只是从服务器接受数据流,并不了解文档的名字,因此服务器必须使用附加信息来告诉客户程序数据的MIME类型。
服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定义,例如对于HTML文档,服务器将首先发送以下两行MIME标识信息,这个标识并不是真正的数据文件的一部分。
Content-type: text/html
注意,第二行为一个空行,这是必须的,使用这个空行的目的是将MIME信息与真正的数据内容分隔开。
如前面所说,在Java中,设定MIME类型的方法是通过Response对象的ContentType属性,设置的方法是使用responsesetContentType(MIME)语句,responsesetContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。
Tomcat的安装目录\conf\webxml中就定义了大量MIME类型 ,可以参考。比如可以设置:
responsesetContentType("text/html; charset=utf-8"); html
responsesetContentType("text/plain; charset=utf-8"); 文本
application/json json数据
这个方法设置发送到客户端的响应的内容类型,此时响应还没有提交。给出的内容类型可以包括字符编码说明,例如:text/html;charset=UTF-8。如果该方法在getWriter()方法被调用之前调用,那么响应的字符编码将仅从给出的内容类型中设置。该方法如果在getWriter()方法被调用之后或者在被提交之后调用,将不会设置响应的字符编码,在使用http协议的情况中,该方法设置 Content-type实体报头。
四.使用$ajax()方法获取json数据的三种方式
dataType参数的配置决定了jquery如何帮助我们自动解析服务器返回的数据,有几种方式可以获取后台返回的json字符串并解析为json对象,下面是Java为例解释,下面三中方式的结果都是图一所示,项目运行在内网,无法截图,只能拍照,见谅。
1、$ajax()参数中不设置dataType,后台response也不设置返回类型,则默认会以普通文本处理responsesetContentType("text/html;charset=utf-8");也是作为文本处理,js中需要手动使用eval()或$parseJSON()等方法将返回的字符串转换为json对象使用。
//Java代码:后台获取单个数控定位器的历史表格的数据
public void getHistorySingleData() throws IOException{
HttpServletRequest request = ServletActionContextgetRequest();
HttpServletResponse response = ServletActionContextgetResponse();
responsesetHeader("Content-type", "text/html;charset=UTF-8");
responsesetContentType("text/html;charset=utf-8");
String deviceName = requestgetParameter("deviceName");
String startDate= requestgetParameter("startDate");
String endDate = requestgetParameter("endDate");
SingleHistoryData[] singleHistoryData = chartServicegetHistorySingleData(deviceName,startDate, endDate);
Systemoutprintln(singleHistoryDatalength);
Systemoutprintln(JSONArrayfromObject(singleHistoryData)toString());//打印:[{"time":"2016-11-11 10:00:00","state":"运行","ball":"锁紧",},{"time":"2016-11-11 10:00:05","state":"运行","ball":"锁紧",},{},{}]查到几条singleHistoryData对象就打印几个对象的信息{"time":"2016-11-11 10:00:05","state":"运行","ball":"锁紧",}
responsegetWriter()print(JSONArrayfromObject(singleHistoryData)toString());
}
/js代码:选择查询某一时间段的数据,点击查询之后进行显示/
$("#search")click(function () {
var data1 = [];
var n;
var deviceName=$("body")attr("id");
var startDate = $("#startDate")val();
var endDate = $("#endDate")val();
$ajax({
url:"/avvii/chart/getHistorySingleData",
type:"post",
data:{
"deviceName":deviceName,
"startDate": startDate,
"endDate": endDate
},
success: function (data) {
alert(data);//---->弹出[{"time":"2016-11-11 10:00:00","state":"运行","ball":"锁紧",},{"time":"2016-11-11 10:00:05","state":"运行","ball":"锁紧",},{},{}],后台传过来几条singleHistoryData对象就打印几个对象的信息{"time":"2016-11-11 10:00:05","state":"运行","ball":"锁紧",}
alert(ObjectprototypetoStringcall(data)); //--->弹出[object String],说明获取的是String类型的数据
var JsonObjs = eval("(" + data + ")"); //或者:var JsonObjs = $parseJSON(data);
alert(JsonObjs);//alert(JsonObjs);---->弹出[object Object],[object Object],[object Object][object Object],[object Object],[object Object]后台传过来几条singleHistoryData对象就打印几个[object Object]
n=JsonObjslength;
if(n==0){
alert("您选择的时间段无数据,请重新查询");
}
for(var i = 0; i < JsonObjslength; i++){
var name = JsonObjs[i]['time'];//针对每一条数据:JsonObjs[i],或者:JsonObjs[i]time
var state = JsonObjs[i]['state'];
var ball = JsonObjs[i]['ball'];
var xd = JsonObjs[i]['xd'];
var yd = JsonObjs[i]['yd'];
var zd = JsonObjs[i]['zd'];
var xf = JsonObjs[i]['xf'];
var yf = JsonObjs[i]['yf'];
var zf = JsonObjs[i]['zf'];
data1[i] = {name:name,state:state,ball:ball,xd:xd,yd:yd,zd:zd,xf:xf,yf:yf,zf:zf};//个数与下面表头对应起来就可以了,至于叫什么名字并不影响控件的使用
}
if(JsonObjslength != 10){
for(var j=0;j<(10-((JsonObjslength)%10));j++){ //补全最后一页的空白行,使表格的长度保持不变
data1[j+JsonObjslength] = {name:" ",state:"",ball:"",xd:"",yd:"",zd:"",xf:"",yf:"",zf:""};
}
}
var userOptions = {
"id":"kingTable", //必须 表格id
"head":["时间","运行状态","球头状态","X向位置/mm","Y向位置/mm","Z向位置/mm","X向承载力/Kg","Y向承载力/Kg","Z向承载力/Kg"], //必须 thead表头
"body":data1, //必须 tbody 后台返回的数据展示
"foot":true, // true/false 是否显示tfoot --- 默认false
"displayNum": 10, //必须 默认 10 每页显示行数
"groupDataNum":6, //可选 默认 10 组数
sort:false, // 点击表头是否排序 true/false --- 默认false
search:false, // 默认为false 没有搜索
lang:{
gopageButtonSearchText:"搜索"
}
}
var cs = new KingTable(null,userOptions);
}
});
});
2、$ajax()参数中设置dataType="json",则jquery会自动将返回的字符串转化为json对象。后台可以设置为:推荐responsesetContentType("text/html;charset=utf-8");或者responsesetContentType("application/json;charset=utf-8");
//Java代码:后台获取单个数控定位器的历史表格的数据
public void getHistorySingleData() throws IOException{
HttpServletRequest request = ServletActionContextgetRequest();
HttpServletResponse response = ServletActionContextgetResponse();
responsesetHeader("Content-type", "text/html;charset=UTF-8");
responsesetContentType("text/html;charset=utf-8");
String deviceName = requestgetParameter("deviceName");
String startDate= requestgetParameter("startDate");
String endDate = requestgetParameter("endDate");
SingleHistoryData[] singleHistoryData = chartServicegetHistorySingleData(deviceName,startDate, endDate);
Systemoutprintln(singleHistoryDatalength);
Systemoutprintln(JSONArrayfromObject(singleHistoryData)toString());//打印:[{"time":"2016-11-11 10:00:00","state":"运行","ball":"锁紧",},{"time":"2016-11-11 10:00:05","state":"运行","ball":"锁紧",},{},{}]查到几条singleHistoryData对象就打印几个对象的信息{"time":"2016-11-11 10:00:05","state":"运行","ball":"锁紧",}
responsegetWriter()print(JSONArrayfromObject(singleHistoryData)toString());
}
/js代码:页面首次加载时,显示规定时间段的数据/
var data1 = [];
var deviceName=$("body")attr("id");
var startDate = $("#startDate")val("2000-01-01 00:00:00");
var endDate = $("#endDate")val("2018-01-01 00:00:00");
$ajax({
url:"/avvii/chart/getHistorySingleData",
type:"post",
data:{
"deviceName":deviceName,
"startDate": "2000-01-01 00:00:00",
"endDate": "2018-01-01 00:00:00"
},
dataType:"json",
success: function (data) {
alert(data);//---->弹出[object Object],[object Object],[object Object][object Object],[object Object],[object Object]后台传过来几条singleHistoryData对象就打印几个json对象:[object Object]
for(var i = 0; i < datalength; i++){
var name = data[i]['time'];
var state = data[i]['state'];
var ball = data[i]['ball'];
var xd = data[i]['xd'];
var yd = data[i]['yd'];
var zd = data[i]['zd'];
var xf = data[i]['xf'];
var yf = data[i]['yf'];
var zf = data[i]['zf'];
data1[i] = {name:name,state:state,ball:ball,xd:xd,yd:yd,zd:zd,xf:xf,yf:yf,zf:zf};
}
if(datalength != 10){
for(var j=0;j<(10-((datalength)%10));j++){ //补全最后一页的空白行,使表格的长度保持不变
data1[j+datalength] = {name:" ",state:"",ball:"",xd:"",yd:"",zd:"",xf:"",yf:"",zf:""};
}
}
var userOptions = {
"id":"kingTable", //必须 表格id
"head":["时间","运行状态","球头状态","X向位置/mm","Y向位置/mm","Z向位置/mm","X向承载力/Kg","Y向承载力/Kg","Z向承载力/Kg"], //必须 thead表头
"body":data1, //必须 tbody 后台返回的数据展示
"foot":true, // true/false 是否显示tfoot --- 默认false
"displayNum": 10, //必须 默认 10 每页显示行数
"groupDataNum":6, //可选 默认 10 组数
sort:false, // 点击表头是否排序 true/false --- 默认false
search:false, // 默认为false 没有搜索
lang:{
gopageButtonSearchText:"搜索"
}
}
var cs = new KingTable(null,userOptions);
}
});
3、ajax方法参
1字典
(ps usernames 是字段,jsonString是转换json格式的字典)
2数组
数组其实和字典一样,只需将(dataWithJSONObject: dicFriends )参数,换成数组就可以了
0条评论