JSON--Java与AJAX(Jquery)

一、JSON 是什么?

JSON 的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。

JSON 与XML 具有相同的特性,例如易于人编写和阅读,易于机器生成和解析。但是JSON 比
XML 数据传输的有效性要高出很多。JSON 完全独立与编程语言,使用文本格式保存。
JSON 数据有两种结构:
• Name-Value 对构成的集合,类似于Java 中的Map。
• Value 的有序列表,类似于Java 中的Array。
一个JSON 格式的数据示例:
{
"Name": "Apple",
"Expiry": "2007/10/11 13:54",
"Price": 3.99,
"Sizes": [
"Small",
"Medium",
"Large"
]
}
更多关于JSON 数据格式的说明参看JSON 官方网站:http://www.json.org(中文
内容参看:http://www.json.org/json-zh.html)

二、通过java来创建JSON对象

1.引入jar包

我这里使用的是json-lib-2.3-jdk15.jar,下载地址:http://sourceforge.net/projects/json-lib/files/

Json-lib requires (at least) the following dependencies in your classpath:

jakarta commons-lang 2.4
jakarta commons-beanutils 1.7.0
jakarta commons-collections 3.2
jakarta commons-logging 1.1.1
ezmorph 1.0.6
2.重要的对象及方法

1)JSONObject:JSON对象{}。

2)JSONArray:JSON数组对象,[{},{}]。

3)fromObject(object):将对象转换为JSON对象。

4)JSONObject.accumulate(key,value):向JSONObject中增加JSON数据,可以重复。

5)element(key,value):向JSON对象中增加JSON数据,如果重复后一个会替换前一个。

6)toString(i,i):将JSON对象转换为字符串,如果包含参数,是将其美化后输出。

以下是一个servlet输出JSON的例子:

package com.netqin.function.demo.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;

import com.netqin.function.demo.model.People;
import com.netqin.function.demo.model.Phone;

public class JsonServlet extends HttpServlet{
private static final String CONTENT_TYPE = "text/plain; charset=UTF-8";

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse response)
   throws ServletException, IOException {
  // TODO Auto-generated method stub
  this.StringToJson(req, response);
//  this.MapToJson(req, response);
//  this.BeanToJson(req, response);
//  this.ListToJson(req, response);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  // TODO Auto-generated method stub
  doGet(req, resp);
}

/**                                                         
* 描述 : <输出>. <br>
*<p>                                                
                                                                                                                                                                                                      
* @param response
* @param content
* @throws IOException                                                                                         
*/
private void print(HttpServletResponse response,String content) throws IOException{
  response.setContentType(CONTENT_TYPE);
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        PrintWriter write = response.getWriter();
        write.print(content);
        write.close();
}



/**                                                         
* 描述 : <将字符串或数组转换为JSON>. <br>
*<p>                                                
        如果字符串本身符合json格式,可以使用如下方法,将json字符串转换为json对象
        String str = "{'check': '1'}"; 
        JSONObject resultJSON = JSONObject.fromObject(str);
       
        获得json对象的内容,各种get方法
        String check = resultJSON.getString("check");


                                                                                                                                                                                           
* @param req
* @param response
* @throws ServletException
* @throws IOException                                                                                         
*/
// @SuppressWarnings("unused")
private void StringToJson(HttpServletRequest req, HttpServletResponse response)throws ServletException, IOException{
  JSONObject resultJSON = new JSONObject();   
        try {   
        
            resultJSON.accumulate("name", "Violet")   
                      .accumulate("occupation", "developer")   
                      .accumulate("age", new Integer(22))
                      .accumulate("array", new int[] { 1, 2, 3 })
                      .accumulate("muliArray","[{'type': '你好', 'value': 'kelly@seankelly.biz'},{'type': 'home', 'pref': 1, 'value': 'kelly@seankelly.tv'}]");
   //System.out.println(resultJSON.toString(1,1));
  } catch (JSONException e) {
   e.printStackTrace();
  }
  this.print(response, resultJSON.toString(1,1));
 
}

输出结果:

{
  "name": "Violet",
  "occupation": "developer",
  "age": 22,
  "array":   [
   1,
   2,
   3
  ],
  "muliArray":   [
      {
    "type": "你好",
    "value": "kelly@seankelly.biz"
   },
      {
    "type": "home",
    "pref": 1,
    "value": "kelly@seankelly.tv"
   }
  ]
}


/**                                                         
* 描述 : <将Map转换为JSON>. <br>
*<p>                                                
                                                                                                                                                                                                      
* @param req
* @param response
* @throws ServletException
* @throws IOException                                                                                         
*/
@SuppressWarnings("unchecked")
private void MapToJson(HttpServletRequest req, HttpServletResponse response)throws ServletException, IOException{
  JSONObject resultJSON = null;   
  Map map = new HashMap(15);
        try {   
         map.put("name", "hanqf");
         map.put("age", 28);
         map.put("phone", "{home:135,busi:139}");
         resultJSON = JSONObject.fromObject(map);
   //System.out.println(resultJSON.toString());
  } catch (JSONException e) {
   e.printStackTrace();
  }
  this.print(response, resultJSON.toString(1,1));
}


输出结果:

{
  "phone": "{home:135,busi:139}",
  "age": 28,
  "name": "hanqf"
}


/**                                                         
* 描述 : <JavaBean转换为JSON>. <br>
*<p>                                                
                                                                                                                                                                                                      
* @param req
* @param response
* @throws ServletException
* @throws IOException                                                                                         
*/
private void BeanToJson(HttpServletRequest req, HttpServletResponse response)throws ServletException, IOException{
  JSONObject resultJSON = null;  
  People people = new People();
  Phone phone = new Phone("135","138");
        try {   
         people.setPhone(phone);
         resultJSON = JSONObject.fromObject(people);
   //System.out.println(resultJSON.toString());
  } catch (JSONException e) {
   e.printStackTrace();
  }
  this.print(response, resultJSON.toString(1,1));
}

public class People{
String name;
int age;
Phone phone = new Phone();

setter and getter

…………………………

}

public class Phone{
String home;
String busi;

setter and getter

…………………………

}

输出结果:

{
  "age": 0,
  "name": "",
  "phone":   {
   "busi": "138",
   "home": "135"
  }
}
--------------------------------------------------------------------------------



/**                                                         
* 描述 : <List转换为JSON>. <br>
*<p>                                                
                                                                                                                                                                                                      
* @param req
* @param response
* @throws ServletException
* @throws IOException                                                                                         
*/
private void ListToJson(HttpServletRequest req, HttpServletResponse response)throws ServletException, IOException{
  JSONArray jsonArray = null;  
  People people = null;
  Phone phone = null;
  List<People> list = new ArrayList<People>();
        try {   
         for(int i =0;i<3;i++){
          people = new People();
          phone = new Phone("135"+i,"138"+i);
          people.setAge(i);
          people.setPhone(phone);
          list.add(people);
         }
         jsonArray = JSONArray.fromObject(list);

   //System.out.println(jsonArray.toString());
  } catch (JSONException e) {
   e.printStackTrace();
  }
  this.print(response, jsonArray.toString(1,1));
}
}
输出结果:

[
    {
   "age": 0,
   "name": "",
   "phone":    {
    "busi": "1380",
    "home": "1350"
   }
  },
    {
   "age": 1,
   "name": "",
   "phone":    {
    "busi": "1381",
    "home": "1351"
   }
  },
    {
   "age": 2,
   "name": "",
   "phone":    {
    "busi": "1382",
    "home": "1352"
   }
  }
]
--------------------------------------------------------------------------------

三、Ajax调用

以<将字符串或数组转换为JSON>. 为例,

{
  "name": "Violet",
  "occupation": "developer",
  "age": 22,
  "array":   [
   1,
   2,
   3
  ],
  "muliArray":   [
      {
    "type": "你好",
    "value": "kelly@seankelly.biz"
   },
      {
    "type": "home",
    "pref": 1,
    "value": "kelly@seankelly.tv"
   }
  ]
}

jsp中主要的代码如下:

<script type="text/javascript" src="jquery-1.2.6.pack.js"></script>

<script type="text/javascript">
jQuery(function($){


  $("#onebut").click(function(){

    $.getJSON("http://localhost:8080/points/json.do",function(data){


      $("#one").html("");
      $("#one").append(data.name);
      $("#one").append("##");
      $("#one").append(data.age);
      $("#one").append("##");
      $("#one").append(data.array[0]);
      //$("#one").append("##");
      //$("#one").append(data.muliArray[0].type);
  
      $.each(data.muliArray,function(i,item){
          $("#one").append("##");
          $("#one").append(item.type);
   
      });


   });


});


});
</script>

<button id="onebut">onebut</button>
<div id="one"></div>

点击"onebut”按钮后,页面上显示如下:

Violet##22##1##你好##home


--------------------------------------------------------------------------------

四、JSON进阶

1.再来看几个重要的对象和方法

1)JSON:JSON对象的顶级接口,JSONObject,JSONArray都实现了该接口

2)JSONSerializer:JSON串行化对象

3)JSONSerializer.toJSON(object):将对象串行化为JSON

4)JSONSerializer.toJava(json):将JSON转换为对象

5)MorphDynaBean:JSONSerializer.toJava(json)后的值默认为MorphDynaBean

6)XMLSerializer:JSON转换为xml对象

7)xMLSerializer.write(json):将JSON对象转换为xml

8)xMLSerializer.read(xml):将xml转换为JSON对象

2.实例

1)json转map

   JSONObject resultJSON = JSONObject.fromObject(map);

   Map mapp = (Map)JSONObject.toBean(resultJSON, Map.class);
   System.out.println(mapp.get("name"));


--------------------------------------------------------------------------------

2)json转JavaBean

   JSONObject resultJSON =JSONObject.fromObject(people);

   People pp = (People)JSONObject.toBean(resultJSON, People.class);
   System.out.println(pp.getPhone().getBusi());


--------------------------------------------------------------------------------

3)json转list

  JSONObject resultJSON = JSONConvert.generate(list);
   
  Map mapp = (Map)JSONObject.toBean(resultJSON, Map.class);
  List<MorphDynaBean> list2 = (List<MorphDynaBean>)mapp.get("root");
  for(MorphDynaBean pp : list2){
   System.out.println(((MorphDynaBean)pp.get("phone")).get("busi"));
  }

说明:

为什么没有使用JSONArray.toArray(jsonArray)或JSONArray.toCollection(jsonArray)呢?

笔者在使用过程中发现其在转换时不能对people.phone对象赋值,也就是说不能嵌套赋值,所以才改用map加MorphDynaBean的方式,也许是笔者没有搞明白,希望高手指点。

这里提供一个JSONConvert工具类,方便bean对象、map和list转换为JSONObject ,如下:

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

public class JSONConvert {

public static JSONObject generate(List list) {

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("totalProperty", list.size());
        map.put("root", list);
        return JSONObject.fromObject(map);
    }

    public static JSONObject javabean2json(Object object) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("success", true);
        map.put("data", object);
        return JSONObject.fromObject(map);
    }

    public static JSONObject objectcollect2json(List list, String total) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("totalProperty", total);
        map.put("root", list);
        return JSONObject.fromObject(map);
    }

}


--------------------------------------------------------------------------------

4)json转xml

需要引入该包:xom-1.1.jar,下载地址:http://repo1.maven.org/maven2/xom/xom/1.1/

  XMLSerializer xmlSe = new XMLSerializer();

  System.out.println("json=="+resultJSON.toString(1, 1));
  String xml = xmlSe.write(resultJSON);
  System.out.println("xml=="+xml);

输出结果:

json==

{
  "age": 0,
  "name": "",
  "phone":   {
   "busi": "139",
   "home": "135"
  }
}
xml==

<?xml version="1.0" encoding="UTF-8"?>
<o>

<age type="number">0</age>

<name type="string"/>

<phone class="object">

<busi type="string">139</busi>

<home type="string">135</home>

</phone>

</o>


--------------------------------------------------------------------------------

5)json的特殊字符处理

由于json的格式要求,“:”“{}”,“[]”,“\”等等都是json的特定字符,

所以如果在name或value中出现了这些字符就会造成json解析异常,

比如:

resultJSON.accumulate("phone", "{home:135,busi:139}");

在页面上的显示结果如下:

{
   "phone":   {
   "home": "135",
   "busi": 139
  }

}

如果json修改成如下形式:

resultJSON.accumulate("phone", "{home:135:11{[,busi:139}");

在页面上的显示结果如下:

{
   "phone": "{home:135:11{[,busi:139}",
}

此时,json会将"{home:135:11{[,busi:139}"都作为phone的值,而不会再向下解析

所以,在遇到这样的问题时只要将value用引号括起来就行了,如下:

resultJSON.accumulate("phone", "{home:'135:11{[',busi:139}");

输出结果如下:

{
   "phone":   {
   "home": "135:11{[",
   "busi": 139
  }

}

这样就可以正常解析了,所以,在创建json时,最好将name和value都用引号扩上。


--------------------------------------------------------------------------------

提供几个JSON的参考资料:

http://www.diybl.com/course/3_program/java/javashl/2007123/89756.html

http://developer.51cto.com/art/201001/176686.htm

 另外,请特别关注如下资料,介绍的非常详细:

http://jiangzhengjun.iteye.com/category/78136 
阅读更多
文章标签: jquery ajax Json
个人分类: Jquery
上一篇Jquery,ajax 跨域访问
下一篇基于linux系统下的SVN服务安装
想对作者说点什么? 我来说一句

JSON--JAVA相互转换数据使用方法

2012年10月19日 97KB 下载

jqueryjqueryjquery

2009年07月27日 1.73MB 下载

ajax jquery的使用

2010年05月12日 3.08MB 下载

JQueryAjax的异步调用 示例

2011年06月25日 142KB 下载

ajax WCF jquery ajax WCF jquery

2010年02月19日 119KB 下载

test jquery ajax

2009年11月18日 52KB 下载

没有更多推荐了,返回首页

关闭
关闭