JSON技術實戰

JSON作爲一種信息的載體伴隨着AJAX的紅火也越來越得到廣大用戶的青睞和認可!在沒有使用JSON的時候,數據
從後臺數據庫到前臺AJAX的返回顯示,一般都要經過SQL查詢--數據封裝(封裝成字符串或者XML文本)--前臺解析
字符串或者XML文本,提取需要的東西出來。這其中包含了太多的轉換關係,勞明傷財,也有很多人在探索一種
能夠使大家都能認識的數據結構,這個時候大家都想到了JSON,可以說JSON也不是新的東西,出來好多年了,
Javascript一直都內置了JSON的支持,很多時候我們都是使用JSON的語法來定義一個Javascript的對象!看一看
JSON的官方網站(http://json.org/)就知道它目前基本上已經覆蓋了大多數語言,這意味着大多數情況下的跨語言
環境下的數據交換,使用JSON是一個不錯的選擇!
1. Javascript(雖然已經內置支持,但是這裏有一個開發包可以使用)
(1) 使用JSON語法定義一個Javascript對象
var myJSONObject = {"bindings": [
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
{"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
{"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
]
};
myJSONObject.bindings[0].method 將返回newURI
(2) 把普通字符串轉換成JavaScript對象(需要擴展包支持)
var myObject = JSON.parse(myJSONtext, filter);
myData = JSON.parse(text, function (key, value) { return key.indexOf('date') >= 0 ? new Date(value) : value; });
(3) JSON對象轉換成字符串
var myJSONText = JSON.stringify(myObject);

2. Java對JSON的支持(沒有原生的支持,需要使用第三方的擴展包來實現)
Java的JSON開發包很多,也有很多實用且功能強大的
(1) json-lib (http://json-lib.sourceforge.net/usage.html)
a.) JSON和Java的類型對應關係
JSON Java
string <=> java.lang.String, java.lang.Character, char
number <=> java.lang.Number, byte, short, int, long, float, double
true|false <=> java.lang.Boolean, boolean
null <=> null
function <=> net.sf.json.JSONFunction
array <=> net.sf.json.JSONArray (object, string, number, boolean, function)
object <=> net.sf.json.JSONObject
b.) json-lib的依賴庫
jakarta commons-lang 2.3
jakarta commons-beanutils 1.7.0
jakarta commons-collections 3.2
jakarta commons-logging 1.1
ezmorph 1.0.3
xom 1.1(如果要用到xml文件的解析的話)
c.) 可運行實例
package com.gomt.json.jsonlib;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.xml.XMLSerializer;

import org.apache.commons.beanutils.PropertyUtils;

public class JsonLibMain {

public JsonLibMain() {
// TODO Auto-generated constructor stub
}

/**
* @param args
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
boolean[] boolArray = new boolean[]{true,false,true};
JSONArray jsonArray = JSONArray.fromObject( boolArray );
System.out.println("***1*** = " + jsonArray );

Collection<String> list = new ArrayList<String>();
list.add( "first" );
list.add( "second" );
jsonArray = JSONArray.fromObject( list );
System.out.println("***2*** = " + jsonArray );

jsonArray = JSONArray.fromObject( "['json','is','easy']" );
System.out.println("***3*** = " + jsonArray );

Map<String, Object> map = new HashMap<String, Object>();
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 jsonObject = JSONObject.fromObject( map );
System.out.println("***4*** = " + jsonObject );

jsonObject = JSONObject.fromObject( new MyBean() );
System.out.println("***5*** = " + jsonObject );

String json = "{name=\"json\",bool:true,int:1,double:2.2,func:function(a){ return a; },array:[1,2]}";

jsonObject = JSONObject.fromObject( json );
Object bean = JSONObject.toBean( jsonObject );
System.out.print("***6*** = " + jsonObject.get( "name" ) + " " + PropertyUtils.getProperty( bean, "name" ) );
System.out.print("\t " + jsonObject.get( "bool" ) + " = " + PropertyUtils.getProperty( bean, "bool" ) );
System.out.print("\t " + jsonObject.get( "int" ) + " = " + PropertyUtils.getProperty( bean, "int" ) );
System.out.print("\t " + jsonObject.get( "double" ) + " = " + PropertyUtils.getProperty( bean, "double" ) );
System.out.print("\t " + jsonObject.get( "func" ) + " = " + PropertyUtils.getProperty( bean, "func" ) );
List expected = JSONArray.toList( jsonObject.getJSONArray( "array" ) );
System.out.println("\t " + expected + " = " + (List) PropertyUtils.getProperty( bean, "array" ) );

json = "{bool:true,integer:1,string:\"json\"}";
jsonObject = JSONObject.fromObject( json );
MyBean myBean = (MyBean) JSONObject.toBean( jsonObject, MyBean.class );
System.out.print("***7*** = " + jsonObject.get( "bool" ) + " = " + Boolean.valueOf( myBean.isBool() ) );
System.out.print("\t " + jsonObject.get( "integer" ) + " = " +new Integer( myBean.getInteger() ) );
System.out.println("\t " + jsonObject.get( "string" )+ " = " + myBean.getString() );

//需要用到ezmorph
json = "{'data':[{'name':'clarance','userId':100001},{'name':'peng','userId':100002}]}";
Map<String,Class<Person>> classMap = new HashMap<String,Class<Person>>();
classMap.put( "data", Person.class );
myBean = (MyBean)JSONObject.toBean(JSONObject.fromObject(json), MyBean.class, classMap);
if(myBean != null && myBean.getData() != null) {
for(Person p : myBean.getData()) {
System.out.println("***8*** = " + "用戶id: " + p.getUserId() + " 用戶名: " + p.getName());
}
}

/*
Morpher dynaMorpher = new BeanMorpher( Person.class, JSONUtils.getMorpherRegistry() );
MorpherRegistry morpherRegistry = new MorpherRegistry();
morpherRegistry.registerMorpher( dynaMorpher );
List output = new ArrayList();
for( Iterator i = myBean.getData().iterator(); i.hasNext(); ){
output.add( morpherRegistry.morph( Person.class, i.next() ) );
}
myBean.setData( output );
*/
/**
* XML和JSON之間的轉換,需要用到xom
*/
jsonObject = new JSONObject( true );
XMLSerializer xmls = new XMLSerializer();
String xml = xmls.write( jsonObject );
System.out.println("***9*** = " + xml);

jsonObject = JSONObject.fromObject("{\"name\":\"json\",\"bool\":true,\"int\":1}");
xmls = new XMLSerializer();
xml = xmls.write( jsonObject );
System.out.println("***10*** = " + xml);

jsonArray = JSONArray.fromObject("[1,2,3]");
xmls = new XMLSerializer();
xml = xmls.write( jsonArray );
System.out.println("***11*** = " + xml);

xml = "<a class=\"array\"><e type=\"function\" params=\"i,j\">return matrix[i][j];</e></a> ";
xmls = new XMLSerializer();
jsonArray = (JSONArray) xmls.read( xml);
System.out.println("***12*** = " + jsonArray );

}

}

package com.gomt.json.jsonlib;

import java.util.List;

import net.sf.json.JSONFunction;

public class MyBean implements java.io.Serializable {
private static final long serialVersionUID = -784610042144660631L;
private String name = "json";
private int pojoId = 1;
private char[] options = new char[]{'a','f'};
private String func1 = "function(i){ return this.options[i]; }";
private JSONFunction func2 = new JSONFunction(new String[]{"i"},"return this.options[i];");
private Integer integer;
private Boolean bool;
private String string;
private List<Person> data;

public Boolean isBool() {
return bool;
}
public void setBool(Boolean bool) {
this.bool = bool;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPojoId() {
return pojoId;
}
public void setPojoId(int pojoId) {
this.pojoId = pojoId;
}
public char[] getOptions() {
return options;
}
public void setOptions(char[] options) {
this.options = options;
}
public String getFunc1() {
return func1;
}
public void setFunc1(String func1) {
this.func1 = func1;
}
public JSONFunction getFunc2() {
return func2;
}
public void setFunc2(JSONFunction func2) {
this.func2 = func2;
}
public Integer getInteger() {
return integer;
}
public void setInteger(Integer integer) {
this.integer = integer;
}
public Boolean getBool() {
return bool;
}
public List<Person> getData() {
return data;
}
public void setData(List<Person> data) {
this.data = data;
}

}


package com.gomt.json.jsonlib;

import java.io.Serializable;

public class Person implements Serializable {

private static final long serialVersionUID = 7699163849016962711L;
private int userId;
private String name;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

d.) 運行結果
***1*** = [true,false,true]
***2*** = ["first","second"]
***3*** = ["json","is","easy"]
***4*** = {"func":function(i){ return this.arr[i]; },"arr":["a","b"],"int":1,"name":"json","bool":true}
***5*** = {"string":"","integer":0,"func1":function(i){ return this.options[i]; },"data":[],"pojoId":1,"name":"json","bool":false,"options":["a","f"],"func2":function(i){ return this.options[i]; }}
***6*** = json json true = true 1 = 1 2.2 = 2.2 function(a){ return a; } = function(a){ return a; } [1, 2] = [1, 2]
***7*** = true = true 1 = 1 json = json
***8*** = 用戶id: 100001 用戶名: clarance
***8*** = 用戶id: 100002 用戶名: peng
***9*** = <?xml version="1.0" encoding="UTF-8"?>
<o null="true"/>

***10*** = <?xml version="1.0" encoding="UTF-8"?>
<o><bool type="boolean">true</bool><int type="number">1</int><name type="string">json</name></o>

***11*** = <?xml version="1.0" encoding="UTF-8"?>
<a><e type="number">1</e><e type="number">2</e><e type="number">3</e></a>

2007-12-7 9:08:29 net.sf.json.xml.XMLSerializer getType
信息: Using default type string
***12*** = [function(i,j){ return matrix[i][j]; }]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章