JavaWeb——AJAX(5)

在请求和响应中使用JSON

1、JSON数据格式

1.1 用JSON表示数据

JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式。在JS语言中,一切都是对象,因此在JSON表示数据时,遵循以下语法规则:

  • 对象表示为键值对
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

下面列举了三个例子:

例子1:
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }

例子2:
 { "people": [ 
  { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, 
  { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" }, 
  { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" } 
 ]}

例子3:
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" } 
 ] 
 }

1.2 访问JSON数据

以上述的第三个例子为例,访问数据类似于C语言的数组。

people.programmers[0].lastName //值为Mclaughlin

1.3 修改JSON数据

以上述第三个例子为例,修改JSON格式的数据。

people.musicians[1].firstName="sergei_change";

1.4 将JSON格式数据转换成字符串

假设myObject是一个JSON格式的对象,将其转换成String格式的myObjectInJSON:

String myObjectInJSON = myObject.toJSONString();

包括本章在内,我们学习了三种数据格式,纯文本(名/值对),XML格式,Json格式。

2、发送JSON到服务器

将JSON发送给服务器可以使用GET或者POST格式。使用GET格式有两个缺点,一是GET请求发送大块数据时,对URL字符串有长度要求;二是,在跨网络以纯文本发送所有数据的时候都需要考虑安全性的问题。

2.1 使用GET发送JSON

假设已经有第一节中例三那样的people对象,保存的是JSON格式的数据。以名值对的样式将其发送到服务器端。

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

escape函数确保people中的空格或者各种字符在传输过程中或者服务器上发生混乱。

2.2 使用POST发送JSON

使用POST发送JSON,记得需要使用setRequestHeader函数设置发送的数据格式。

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

在这段代码中,url的末尾增加了时间,POST每次都会实际生成请求骗过浏览器不会用缓存来自动响应。

3、服务器解析JSON

处理JSON的两个步骤:

  • 针对编写服务器端程序所用的语言,找到相应的JSON解析器。
  • 针对JSON解析器取得来自客户机的请求数据并将数据转换成脚本能够理解的东西。

3.1 寻找JSON解析器

如果使用Java Sevlet,可以选择json.org上的org.json包。

  • 分别下载JSON的javascript包和Java包。
  • 将json.js导入到WebRoot的某个位置。
  • 将Java包导入到Web应用的classpath中。
  • 客户端和服务器端按照JSON的数据格式进行数据交换。

3.2 使用JSON解析器

下面是使用org.json包获得JSON数据结构中的内容并将接收到的信息响应给客户端的过程。

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //读取客户端提交的JSON数据
        StringBuffer json = new StringBuffer();
        String line = null;
        BufferedReader reader = request.getReader();
        while ((line = reader.readLine())!= null){
            //对读取的数据进行编码转换
            line = new String(line.getBytes("ISO8859-1"),"UTF-8");          
            json.append(line);//附加
        }

        //建立一个服务端的JSONObject对象解析客户端的JSON数据
        JSONObject jsonObj = null;
        try{
            jsonObj = new JSONObject(json.toString());
        }catch(Exception ex){
            ex.printStackTrace();
        }

        //从JSONObject对象中取出各项数据进行处理
        String userName,password,department,headship,sex,old;
        try{
            userName = jsonObj.getString("userName").toUpperCase();
            password = jsonObj.getString("password");
            department = jsonObj.getString("department").toUpperCase();
            headship = jsonObj.getString("headship").toUpperCase();
            sex = jsonObj.getString("sex");
            old = jsonObj.getString("old")+"岁";
            if (sex.equals("1")){
                userName = userName + "先生";
                sex = "男";
            }else{
                userName = userName + "女士";
                sex = "女";
            }           
            //将处理后的数据封装入JSONObject对象
            jsonObj.put("userName",userName);
            jsonObj.put("password",password);
            jsonObj.put("department",department);
            jsonObj.put("headship",headship);
            jsonObj.put("sex",sex);
            jsonObj.put("old",old); 
        }catch(Exception ex){
            ex.printStackTrace();
        }

        //将JSONObject对象转换成字符串后返回客户端
        response.setContentType("text/html");
        response.setCharacterEncoding("gb2312");
        PrintWriter out = response.getWriter();     
        out.println(jsonObj.toString());
        out.flush();
        out.close();        
    }

4、HTTP的Content-Type

在前几节内容中都涉及到Content-Type这个HTTP头字段,HTTP协议采用了请求/响应模型,客户端向服务器发送请求时,请求头部包括请求的方法,url,协议版本,以及包含请求修饰符、客户信息和内容的类似MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体原信息以及可能的实体内容。

请求信息和相应信息都可以包含实体信息。实体信息由实体头域和实体组成。Content-Type就是实体头域中的一个非常重要的内容,表示后面的文档属于什么MIME类型。

目前本文章中两次涉及到Content-Type这个字段的使用。分别是使用XML和JSON格式的数据格式发送请求信息时,需要调用XMLHttpRequest对象的setResponseHeader方法,设置Content-Type的属性值。

  • text/xml:在使用POST发送请求,且发送的数据为XML文本格式时,设置为text/xml。
  • application/x-www-form-urlencoded:当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。
  • text/plain:无格式文本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值