本文主要講述如下幾個(gè)內(nèi)容:
1、JSON定義以及JSON的特性
2、如何在JavaScript中解釋JSON格式數(shù)據(jù)
3、如何在Java代碼中使用JSON(講對(duì)象轉(zhuǎn)換成JSON對(duì)象以及解釋JSON字符串)
一、JSON
w3c上對(duì)JSON有比較詳細(xì)的介紹,鏈接http://www.w3school.com.cn/json/index.asp.下面僅講述重要的幾點(diǎn)。
Json是 JavaScript 對(duì)象表示法(JavaScript Object Notation),是輕量級(jí)的文本數(shù)據(jù)交換格式,具有層級(jí)結(jié)構(gòu)(值中存在值), 數(shù)據(jù)可使用
AJAX 進(jìn)行傳輸,獨(dú)立于語言,具有自我描述性,比XML更小更快更容易解析。JSON格式字符串轉(zhuǎn)化為JavaScript對(duì)象無需解析器, JSON 使用 JavaScript 語法,使用JavaScript的eval()函數(shù)可生成JavaScript對(duì)象。
下面給出JSON格式的數(shù)據(jù),非常清晰,無需多做解釋,語法請(qǐng)閱讀官方文檔。
標(biāo)準(zhǔn)JSON格式數(shù)據(jù)
{ "firstName":"John" , "lastName":"Doe" }
標(biāo)準(zhǔn)JSON格式數(shù)組數(shù)據(jù)
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
或直接賦值給變量:
var employees = [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName": "Carter" }
];
二、在JavaScript中解釋JSON數(shù)據(jù)
JSON 最常見的用法之一,是從 web 服務(wù)器上讀取 JSON 數(shù)據(jù)(作為文件或作為 HttpRequest),將 JSON 數(shù)據(jù)轉(zhuǎn)換為 JavaScript 對(duì)象,然后在網(wǎng)頁(yè)中使用該數(shù)據(jù)。
下面直接給出代碼示例:
- <pre name="code" class="html"><html>
- <head>
- </head>
- <script type="text/javascript">
- function testjson(){
-
- //Json格式的字符串
- var txt = '{ "employees" : [' +
- '{ "firstName":"Bill" , "lastName":"Gates" },' +
- '{ "firstName":"George" , "lastName":"Bush" },' +
- '{ "firstName":"Thomas" , "lastName":"Carter" } ]}';
-
- //使用eval函數(shù)轉(zhuǎn)換成JSON對(duì)象
- //eval() 函數(shù)使用的是 JavaScript 編譯器,可解析 JSON 文本,然后生成 JavaScript 對(duì)象。必須把文本包圍在括號(hào)中,這樣才能避免語法錯(cuò)誤:
- var obj = eval ("(" + txt
- + ")");
- //通過對(duì)象名,然后根據(jù)數(shù)組下標(biāo)以及屬性名取值
- alert(obj.employees[0].firstName);
- }
-
- </script>
- <body>
- <a href="" onclick="testjson()">Click me!</a>
- </body>
- </html>
直接保存為后綴名為html或htm的文件,用瀏覽器打開,就可以測(cè)試運(yùn)行結(jié)果了。
三、Java操作JSON
1、Josn-lib
JSON-lib這個(gè)Java類包用于把bean,map和XML轉(zhuǎn)換成JSON并能夠把JSON轉(zhuǎn)回成bean和DynaBean。
下載地址:http://json-lib./
還要需要的第3方包:
rg.apache.commons(3.2以上版本)
org.apache.oronet.sf.
ezmorph(ezmorph-1.0.4.jar)
nu.xom
下面直接給出代碼:
- package com.doyeden.json;
-
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import org.apache.commons.beanutils.PropertyUtils;
-
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
- import net.sf.json.xml.XMLSerializer;
-
- public class TestJson {
- public static void main(String[] args) {
-
- // 1. List
- boolean[] booleanArray = new boolean[] { false, false, true, false };
- JSONArray ja = JSONArray.fromObject(booleanArray);
- System.err.println(ja);
-
- List list = new ArrayList();
- list.add("first");
- list.add("second");
- JSONArray jsonArray2 = JSONArray.fromObject(list);
- System.out.println(jsonArray2);
-
- JSONArray jsonArray3 = JSONArray.fromObject("['json','is','easy']");
- System.out.println(jsonArray3);
-
- // 2. Map
- Map map = new HashMap();
- map.put("name", "json");
- map.put("bool", Boolean.TRUE);
- map.put("int", new Integer(1));
- map.put("arr", new String[] { "a", "b" });
- map.put("func", "function(i){ return this.arr[i]; }");
- JSONObject json = JSONObject.fromObject(map);
- System.out.println(json);
-
- // 3. JSON Bean
- JSONObject jsonObject = JSONObject.fromObject(new JsonBean("kevin",
- "Male"));
- System.out.println(jsonObject);
-
- // 4. Json Beans
- List<JsonBean> lbs = new ArrayList<JsonBean>();
- JsonBean j1 = new JsonBean("kevin", "Male");
- JsonBean j2 = new JsonBean("maimai", "Femal");
- lbs.add(j1);
- lbs.add(j2);
- JSONArray ja_beans = JSONArray.fromObject(lbs);
- System.out.println(ja_beans);
-
- }
- }
下面的類的get和set方法必須有才可以
- package com.doyeden.json;
-
- public class JsonBean {
- private String name;
- private String sex;
-
- public JsonBean() {
- super();
- }
- public JsonBean(String name, String sex) {
- super();
- this.name = name;
- this.sex = sex;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
-
- }
程序運(yùn)行結(jié)果:
- [false,false,true,false]
- ["first","second"]
- ["json","is","easy"]
- {"arr":["a","b"],"int":1,"name":"json","func":function(i){ return this.arr[i]; },"bool":true}
- {"name":"kevin","sex":"Male"}
- [{"name":"kevin","sex":"Male"},{"name":"maimai","sex":"Femal"}]
2、 目前比較流行的fast-json解析 ,更多fast-json請(qǐng)自行查閱文檔
阿里巴巴FastJson是一個(gè)Json處理工具包,包括“序列化”和“反序列化”兩部分,它具備如下特征:
速度最快,測(cè)試表明,fastjson具有極快的性能,超越任其他的Java Json parser。包括自稱最快的JackJson;
功能強(qiáng)大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自??;無依賴,能夠直接運(yùn)行在
Java SE 5.0以上版本;支持Android;開源 (Apache 2.0)
Fastjson API入口類是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON類上的靜態(tài)方法直接完成。
public static final Object
parse(String text); //
把JSON文本parse為JSONObject或者JSONArray
public static final JSONObject
parseObject(String text); //
把JSON文本parse成JSONObject
public static final T
parseObject(String text, Class clazz); //
把JSON文本parse為JavaBean
public static final JSONArray
parseArray(String text); //
把JSON文本parse成JSONArray
public static final List
parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
public static final String
toJSONString(Object object); //
將JavaBean序列化為JSON文本
public static final String
toJSONString(Object object, boolean prettyFormat); //
將JavaBean序列化為帶格式的JSON文本
public static final Object
toJSON(Object javaObject); 將JavaBean轉(zhuǎn)換為JSONObject或者JSONArray。
實(shí)例代碼:
(需要導(dǎo)入fastjson的jar包)
- package com.doyeden.json.fastjson;
-
- import java.util.ArrayList;
- import java.util.List;
-
- import com.alibaba.fastjson.JSON;
- import com.doyeden.json.JsonBean;
-
- public class Test {
- public static void main(String[] args) {
-
- //1 parse bean to json text
- JsonBean jb=new JsonBean("kevin","Male");
- System.out.println(JSON.toJSONString(jb));
-
- //2 parse list to json array
- List<JsonBean> ljs=new ArrayList<JsonBean>();
- JsonBean jb1=new JsonBean("kevin","Male");
- JsonBean jb2=new JsonBean("maimai","Female");
- ljs.add(jb2);
- ljs.add(jb1);
- System.out.println(JSON.toJSONString(ljs));
-
- //3 parse json text to bean
- String s="{\"name\":\"greg\",\"sex\":\"Male\"}";
- JSON jO=JSON.parseObject(s);
- JsonBean j=JSON.toJavaObject(jO, JsonBean.class);
- System.out.println(j.getName());
-
- }
- }
結(jié)果:
{"name":"kevin","sex":"Male"}
[{"name":"maimai","sex":"Female"},{"name":"kevin","sex":"Male"}]
greg
3、其他方式,例如 org-lib等,使用方法跟上述兩種方式非常相似。就不做更多介紹了。個(gè)人推薦還是使用fast-json。
總結(jié):本文講述了JSON格式數(shù)據(jù)以及如何在JavaScript和Java代碼中操作JSON格式數(shù)據(jù),可以發(fā)現(xiàn),因?yàn)镴SON自解釋性,輕量級(jí),體積小,跨平臺(tái)等特點(diǎn),JSON格式數(shù)據(jù)非常適合作為和后端數(shù)據(jù)交互的格式。JavaScript本身就可以解釋JSON,這樣就省去了很多第三方庫(kù),java中,關(guān)于講JSON轉(zhuǎn)換成Java對(duì)象以及講Java對(duì)象和對(duì)象數(shù)組轉(zhuǎn)換成JSON格式數(shù)據(jù)的類庫(kù)其實(shí)有很多,但是目前來說最快的是fastjson.
|