文档章节

JSON使用总结

gulf
 gulf
发布于 2017/04/25 19:59
字数 1551
阅读 70
收藏 0

1.JSON定义

       JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。

       JSON语法声明了一个对象,是一种用于传输和生成数据的协定

       对象:对象包含再{}之间
       属性:采用Key-Value对来表示。属性之间使用逗号分开。  string : value 
       数组:数组存放再[]之间   [ elements ] 
       元素:元素之间用逗号分开
       值:值可以是字符串,数字,对象,数组,true,false,null

2.JSON例子

       {

        "name":"andy",

        "people":{"name":"andy","age":"28"},

        "friend":["name":"value",

                      {"name":"value","age":"28"}

                     ]

        }

3.在服务器上解释 JSON

       处理 JSON 的两步骤:
       针对编写服务器端程序所用的语言,找到相应的 JSON 解析器/工具箱/帮助器 API。 
       使用 JSON 解析器/工具箱/帮助器 API 取得来自客户机的请求数据并将数据转变成脚本能理解的东西

      

      我将介绍如何用 org.json 这个 Java API 在 Java 类上创建 toJSONObject() 方法。然后,就可以把 JSONObject 简单地序列化成 JSON。

      public JSONObject toJSONObject() {
              JSONObject json = new JSONObject();
              json.put("id",id);
              json.put("cost",getFormattedCost());
              json.put("date",date);
              JSONArray jsonItems = new JSONArray();
                 for (Iterator<Item> iter = 
                              items.iterator() ; iter.hasNext() ; ) {
                                              jsonItems.put(iter.next().toJSONObject());
                               }
               json.put("items",jsonItems);
             return json;
    }

       可以看到,org.json API 非常简单。 JSONObject 代表 JavaScript 对象(即联合数组),有不同的 put() 方法,方法接受的 String 键和值是原生类型、String 类型或其他 JSON 类型。JSONArray 代表索引数组,所以它的 put() 方法只接受一个值。请注意在清单 8 中,创建 jsonItems 数组,然后再用 put() 把它附加到 json 对象上;可以用另外一种方法做这项工作,就是对每个项目调用 json.accumulate("items",iter.next().toJSONObject());accumulate() 方法与 put() 类似,区别在于它把值添加到按照键进行识别的索引数组。

       清单 9 显示了如何序列化 JSONObject 并把它写入 servlet 响应。

       public void doGet(HttpServletRequest req, HttpServletResponse res) 
                        throws java.io.IOException, ServletException {
               String custId = req.getParameter("username");
                Customer customer = getCustomer(custId);
  res.setContentType("application/x-json");
  res.getWriter().print(customer.toJSONObject());
      }

可以看到,它实际上什么也没有做。在这里隐式调用的 JSONObject 的 toString() 方法做了所有工作。请注意,application/x-json 内容类型还有一点不确定 —— 在编写这篇文章的时候,关于 JSON 应当属于什么 MIME 类型还没有定论。但是,目前 application/x-json 是合理的选择。


4.在客户端使用JSON

----通过 GET 以名称/值对发送 JSON

将 JSON 数据发给服务器的最简单方法是将其转换成文本,然后以名称/值对的值的方式进行发送。请务必注意,JSON 格式的数据是相当长的一个对象,看起来可能会如清单 1 所示:
清单 1. JSON 格式的简单 JavaScript 对象
                
var people =  { "programmers": [    { "firstName": "Brett", "lastName":"McLaughlin",
"email": "brett@newInstance.com" },    { "firstName": "Jason", "lastName":"Hunter",
"email": "jason@servlets.com" },    { "firstName": "Elliotte", "lastName":"Harold",
"email": "elharo@macfaq.com" }   ],  "authors": [    { "firstName": "Isaac", 
"lastName": "Asimov", "genre": "science fiction" },    { "firstName": "Tad", 
"lastName": "Williams", "genre": "fantasy" },    { "firstName": "Frank", 
"lastName": "Peretti", "genre": "christian fiction" }   ],  "musicians": [    
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },   
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }   ]  }
 
如果要以名称/值对将其发送到服务器端,应该如下所示:

var url = "organizePeople.aspx?people=" + people.toJSONString();
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = updatePage;
xmlHttp.send(null);

存在一个问题:在 JSON 数据中会有空格和各种字符,Web 浏览器往往要尝试对其继续编译。要确保这些字符不会在服务器上(或者在将数据发送给服务器的过程中)引起混乱,需要在 JavaScript escape() 函数中做如下添加:

var url = "organizePeople.aspx?people=" + escape(people.toJSONString());
request.open("GET", url, true);
request.onreadystatechange = updatePage;
request.send(null);

该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成 Web 可用字符(比如,空格会被转换成 %20,浏览器并不会将其视为空格处理,而是不做更改,将其直接传递到服务器)。之后,服务器会(通常自动)再把它们转换回它们传输后的本来 “面目”。

这种做法的缺点有两个:
在使用 GET 请求发送大块数据时,对 URL 字符串有长度限制。虽然这个限制很宽泛,但对象的 JSON 字符串表示的长度可能超出您的想象,尤其是在使用极其复杂的对象时更是如此。 
在跨网络以纯文本发送所有数据的时候,发送数据面临的不安全性超出了您的处理能力。 
简言之,以上是 GET 请求的两个限制,而不是简单的两个与 JSON 数据相关的事情。在想要发送用户名和姓之外的更多内容,比如表单中的选择时,二者可能会需要多加注意。若要处理任何机密或极长的内容,可以使用 POST 请求。

----利用 POST 请求发送 JSON 数据

当决定使用 POST 请求将 JSON 数据发送给服务器时,并不需要对代码进行大量更改,如下所示:

var url = "organizePeople.PHP?timeStamp=" + new Date().getTime();
request.open("POST", url, true);
request.onreadystatechange = updatePage;
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send(people.toJSONString());

使用 POST 而非 GET 打开,Content-Type 头被设置为让服务器预知它能得到何种数据。在这种情况下,即为 application/x-www-form-urlencoded,它让服务器知道现在发送的是文本,正如它从常规的 HTML 表单中得到的一样。
另一个简单提示是 URL 的末尾追加了时间。这就确保了请求不会在它第一次被发送后即缓存,而是会在此方法每次被调用后重新创建和重发;此 URL 会由于时间戳的不同而稍微有些不同。这种技巧常被用于确保到脚本的 POST 每次都会实际生成新请求且 Web 服务器不会尝试缓存来自服务器的响应。

 

 

 

 

 

处理的最后一步是把在客户端把 JSON 数据变成 JavaScript 对象。这可以通过对 eval() 的简单调用实现,这个函数可以即时地解释包含 JavaScript 表达式的字符串。清单 11 把 JSON 响应转变成 JavaScript 对象图

var jsonExpression = "(" + req.responseText + ")";
var customer = eval(jsonExpression);
// Find name of first item in customer's last order
var lastOrder = customer.orders[customer.orders.length-1];
var name = lastOrder.items[0].name;

本文转载自:http://blog.csdn.net/lovesaxphone/article/details/4595053

共有 人打赏支持
gulf
粉丝 12
博文 276
码字总数 156468
作品 0
广州
程序员
JSON学习总结

什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSON 具有自我描述性,更易理解 * JSON 使用 JavaSc...

拷贝忍者卡卡习
2016/04/02
6
0
前后端数据交互方法总结

前后端数据交互方法 在此介绍几种常用的前后端数据交互方法,并给出使用建议。以提高前后端协同开发的效率。 目录: HTML赋值 JS赋值 script填充JSON AJAX获取JSON WebSocket实时传输数据 总结...

303Donatello
2017/11/21
0
0
Javascript中的Array(数组) 、{}(映射) 与JSON解析

做网页总会使用javascript,使用javascript总会使用JSON。最近用到一下,就写写。 下面是总结: 1.将javascript中的Array和{}转化为json字符串可以使用json2.js,源码地址https://github.co...

旭东的博客
2014/08/13
0
0
php对象转数组的黑技术

通常在php中,想把对象处理成数组是需要花费点精力的。 但是今天在这里,我告诉你一个so easy的黑技术来解决这个问题。

hgditren
2017/10/20
0
0
golang -- 序列化 msgpack & json

下面总结一下go的序列化,通信中常用的格式:msgpack和json msgpack 安装: go get go get github.com/vmihailenco/msgpack go install github.com/vmihailenco/msgpack api:http://godoc.org/g......

flyking
2014/01/08
0
1

没有更多内容

加载失败,请刷新页面

加载更多

中国移动蔡谦:5G传输准备就绪

目前5G已成业界热议话题,在即将到来的万物互联时代,5G是非常关键的技术。且5G相比4G,业务场景多种多样,对5G承载网带来巨大挑战。5G传输,承载先行并不仅仅是一个口号。当前5G承载网的部署...

linux-tao
21分钟前
4
0
维护“修理权”,苹果使用专有软件工具来修复MacBook Pro和iMac Pro

根据上月发给苹果授权服务提供商的一份文件,苹果公司正在使用新的专有软件诊断工具来修复MacBook Pros和iMac Pros,如果不用专有软件工具来修复关键部件,将会导致“系统失效和修复不完整”...

linuxCool
51分钟前
2
0
cacti监控安装

cacti是用PHP实现的一个软件,它用snmp服务获取数据,然后用rrdtool存储和更新数据,并生成图表展示。比较适合用于交换机、路由器的网络监控,插件众多,可图示化显示网络状况。 cacti官方推...

hiwill
今天
4
0
shell特殊符号、cut、sort、uniq、wc、tee、tr、split命令

10月15日任务 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下 cut 命令 cut作用:截取字符串 用法如下:cat /etc/passwd |head -2 |cut -d ...

hhpuppy
今天
4
0
Springboot实现filter拦截token验证和跨域

背景 web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需要引入其...

funnymin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部