zoukankan      html  css  js  c++  java
  • json学习

    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());
          }

    可以看到,它实际上什么也没有做。在这里隐式调用的 JSONObjecttoString() 方法做了所有工作。请注意,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;

             转自JSON学习总结                     

  • 相关阅读:
    iOS适配HTTPS,创建一个自签名的SSL证书(x509)具体步骤
    iOS UIWebView 访问https绕过证书验证的方法
    socket 同步阻塞传输数据与关闭
    cookie范例
    Cookie的实现
    服务器如何处理http请求
    Web 服务器与应用服务器的区别是什么?
    servlet
    Apache、Nginx与Tomcat的区别
    Http 请求处理流程
  • 原文地址:https://www.cnblogs.com/guoyong-feng/p/6052966.html
Copyright © 2011-2022 走看看