javascript
JSON,java对象转json
?服務(wù)器返回給異步對(duì)象的數(shù)據(jù)載體:
? ? ?1.HTML
? ? ?2.XML
? ? ?3.JSON
?
一)什么是JSON
?? (1)JSON(Java Script Object Notation(記號(hào),標(biāo)記))是一種輕量級(jí)的數(shù)據(jù)交換語(yǔ)言,以文本字符串為基礎(chǔ),且易于讓人閱讀。
? ? ? ? ? ? 注意:XML就是一個(gè)重量級(jí)的數(shù)據(jù)交換語(yǔ)言
?? (2)JSON采用完全獨(dú)立于任何程序語(yǔ)言的文本格式,使JSON成為理想的數(shù)據(jù)交換語(yǔ)言
?
二)JSON的作用
?? (1)簡(jiǎn)化JS中創(chuàng)建自定義對(duì)象的方式
??????? 注意:JSON就是用JS語(yǔ)法來(lái)書(shū)寫(xiě),所以必須放在<script>標(biāo)簽中
????????????? 在用JS語(yǔ)法書(shū)寫(xiě)JSON時(shí),最外面不要用""雙引號(hào)
?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>簡(jiǎn)化創(chuàng)建自定義對(duì)象的方式</title><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body><!-- js方式定義Person對(duì)象<script type="text/javascript">function Person(id,name,sal){this.id = id;this.name = name;this.sal = sal;}var p = new Person(1,"波波",7000);document.write("編號(hào):" + p.id + "<br/>");document.write("姓名:" + p.name + "<br/>");document.write("薪水:" + p.sal + "<br/>");</script>--><hr/><!-- json方式定義Person對(duì)象 --><script type="text/javascript">//采用js語(yǔ)言來(lái)書(shū)寫(xiě)var p = {id:1,name:"包包",sal:8000};//id可寫(xiě)為"id",name亦可以加引號(hào)//屬性可以''或""符號(hào)//字符串必加''或""符號(hào),其它類型不用加符號(hào) document.write("編號(hào):" + p.id + "<br/>");document.write("姓名:" + p.name + "<br/>");document.write("薪水:" + p.sal + "<br/>");</script></body> </html>?
var p = { id:1,name:"哈哈",tel:[{no:"135",type:"中移動(dòng)"},{no:"133",type:"中聯(lián)通"}],show:function(username){alert("你的姓名是:" + p.name+":"+username);},isSingle:false };var p = {'city':['北京','上海','廣州','深圳']}; for(var i=0;i<p.city.length;i++){document.write(p.city[i]+"<br/>"); }?
<html><head><title>創(chuàng)建一個(gè)數(shù)組,數(shù)組中有三個(gè)對(duì)象</title><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body><script type="text/javascript">var ps = [{id:1,name:'哈哈'},{id:2,name:'呵呵'},{id:3,name:'嘻嘻'}];</script><script type="text/javascript">document.write("共有" + ps.length + "個(gè)學(xué)生<br/>");for(var i=0;i<ps.length;i++){document.write("編號(hào):" + ps[i].id + "<br/>");document.write("姓名:" + ps[i].name + "<br/>");}</script></body> </html>?
<html><head><title>創(chuàng)建一個(gè)對(duì)象,使用function做為屬性值</title><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body><script type="text/javascript">var p = {id:1,name:'哈哈',isLove:true,home:['廣州','深圳'],show : function(str){alert("你是" + str);}};//document.write(p.isLove?"已婚":"單身"+"<br/>"); p.show("趙君");</script></body> </html>?
(2)在AJAX中,作為數(shù)據(jù)載體之一
??????? 注意:JS可以直接解析JSON格式的文本,前提是:該JSON必須采用JS格式書(shū)寫(xiě)的才行,如果該JSON是采用Java格式寫(xiě)的,必須使用eval()函數(shù)轉(zhuǎn)換后,方可被JS解析,該eval("")函數(shù)接收一個(gè)字符串格式的內(nèi)容。
(3)省份-城市-區(qū)域三級(jí)聯(lián)動(dòng)【Struts2 + JSON版】
??? ????切記:將來(lái)JSON是不能完完全全替代XML的,只能在定義對(duì)象和數(shù)據(jù)交換語(yǔ)言方面替代
?
JSP頁(yè)面:
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>省份-城市-區(qū)域三級(jí)聯(lián)動(dòng)【Struts2 + JSON版】</title><script type="text/javascript" src="js/ajax.js"></script></head><body><select id="provinceID" style="width:111px"><option>選擇省份</option><option>湖北</option><option>湖南</option><option>廣東</option></select><select id="cityID" style="width:111px"><option>選擇城市</option></select><select id="areaID" style="width:111px"><option>選擇區(qū)域</option></select><!-- 省份->城市 --><script type="text/javascript">document.getElementById("provinceID").onchange = function(){//清空城市下拉框var cityElement = document.getElementById("cityID");cityElement.options.length = 1;//清空區(qū)域下拉框var areaElement = document.getElementById("areaID");areaElement.options.length = 1;var province = this[this.selectedIndex].innerHTML;if("選擇省份" != province){//NO1)var ajax = createAJAX();//NO2)var method = "POST";var url = "${pageContext.request.contextPath}/findCityByProvinceRequest?time="+new Date().getTime();ajax.open(method,url);//NO3) ajax.setRequestHeader("content-type","application/x-www-form-urlencoded")//NO4)var content = "bean.province=" + province;ajax.send(content);//-------------------------------------------等待//NO5 ajax.onreadystatechange = function(){if(ajax.readyState == 4){if(ajax.status == 200){//NO6)返回JAVA格式的JSON文本var jsonJAVA = ajax.responseText;//jsonJAVA所代表的是java格式的json文本,是不能直接被js執(zhí)行的//解決方案:將java格式的json文本,轉(zhuǎn)成js格式的json文本//如何做:用js提供的一個(gè)函數(shù)搞定var jsonJS = eval("("+jsonJAVA+")"); 注意。在java中這里是固定寫(xiě)法,不能寫(xiě)為eval(jsonJAVA)var array = jsonJS.cityList;var size = array.length;for(var i=0;i<size;i++){var city = array[i];var option = document.createElement("option");option.innerHTML = city;cityElement.appendChild(option);}}} }}}</script><!-- 城市->區(qū)域 --><script type="text/javascript">document.getElementById("cityID").onchange = function(){var areaElement = document.getElementById("areaID");areaElement.options.length = 1;var city = this[this.selectedIndex].innerHTML;if("選擇城市" != city){//NO1)var ajax = createAJAX();//NO2)var method = "POST";var url = "${pageContext.request.contextPath}/findAreaByCityRequest?time="+new Date().getTime();ajax.open(method,url);//NO3) ajax.setRequestHeader("content-type","application/x-www-form-urlencoded")//NO4)var content = "bean.city=" + city;ajax.send(content);//------------------------------------------等待//NO5) ajax.onreadystatechange = function(){if(ajax.readyState == 4){if(ajax.status == 200){ //NO6)var jsonJAVA = ajax.responseText;var jsonJS = eval("("+jsonJAVA+")");var array = jsonJS.areaList;var size = array.length;for(var i=0;i<size;i++){var area = array[i];var option = document.createElement("option");option.innerHTML = area;areaElement.appendChild(option);}}}}}}</script></body> </html>?
/*** 封裝省份和城市* @author AdminTC*/ public class Bean {private String province;//省份private String city;//城市public Bean(){}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;} }?
ProvinceCityAreaAction.java
package cn.itcast.javaee.js.provincecityarea;import java.util.ArrayList; import java.util.List;import com.opensymphony.xwork2.ActionSupport;/*** 省份-城市-區(qū)域三級(jí)聯(lián)動(dòng)【Struts2 + JSON版】* @author AdminTC*/ public class ProvinceCityAreaAction extends ActionSupport{private Bean bean;public Bean getBean() {return bean;}public void setBean(Bean bean) {this.bean = bean;}/*** 根據(jù)省份獲取城市 */public String findCityByProvince() throws Exception {cityList = new ArrayList<String>();//注意:這里返回的json必須提供get,set方法,即必須為實(shí)例變量if("湖北".equals(bean.getProvince())){cityList.add("武漢");cityList.add("赤壁");}else if("湖南".equals(bean.getProvince())){cityList.add("郴州");cityList.add("張家界");cityList.add("瀏陽(yáng)");}else if("廣東".equals(bean.getProvince())){cityList.add("陽(yáng)江");cityList.add("清遠(yuǎn)");cityList.add("佛山");cityList.add("湛江");}//讓struts2框架幫你將List/Set/Map<String>轉(zhuǎn)成JSON文本 使用struts2-json-plugin-2.3.1.1.jar 在項(xiàng)目中引入該jar包即可return SUCCESS;}/*** 根據(jù)城市獲取區(qū)域 */public String findAreaByCity() throws Exception {areaList = new ArrayList<String>();if("陽(yáng)江".equals(bean.getCity())){areaList.add("AA");areaList.add("BB");}else if("清遠(yuǎn)".equals(bean.getCity())){areaList.add("CC");areaList.add("DD");;}else if("佛山".equals(bean.getCity())){areaList.add("EE");areaList.add("FF");}else if("湛江".equals(bean.getCity())){areaList.add("GG");areaList.add("HH");}return SUCCESS;}private List<String> areaList;//區(qū)域的集合 必須寫(xiě)此實(shí)例變量,并提供get方法,struts2轉(zhuǎn)成json的時(shí)候會(huì)調(diào)用get方法,所以要返回的json值必須這么寫(xiě)。private List<String> cityList;//城市的集合public List<String> getCityList() {return cityList;}public List<String> getAreaList() {return areaList;} }?
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><package name="myPackage" extends="json-default" namespace="/"> json-default繼承Struts-default<!-- 全局結(jié)果類型 --><global-results><result name="success" type="json"/></global-results><action name="checkRequest" class="cn.itcast.javaee.js.checkcode.CheckcodeAction" method="check"> </action><!-- 省份->城市 --><action name="findCityByProvinceRequest" class="cn.itcast.javaee.js.provincecityarea.ProvinceCityAreaAction" method="findCityByProvince">
<result name="success" type="json">
</action><!-- 城市->區(qū)域 --><action name="findAreaByCityRequest" class="cn.itcast.javaee.js.provincecityarea.ProvinceCityAreaAction" method="findAreaByCity"></action></package> </struts>
?
三)使用第三方工具,將JavaBean對(duì)象/List或Set或Map對(duì)象轉(zhuǎn)成JSON
? ?上面在struts2中,使用了Struts2框架的功能,struts2-json-plugin-3.2.1.1.jar把list等對(duì)象轉(zhuǎn)成json對(duì)象,但是如果在開(kāi)發(fā)中使用的不是Struts2,而是其他技術(shù)呢,那如何把list等java對(duì)象轉(zhuǎn)成JSON呢?
? ? 準(zhǔn)備導(dǎo)入第三方j(luò)ar包:
??? 》commons-beanutils-1.7.0.jar
??? 》commons-collections-3.1.jar
??? 》commons-lang-2.5.jar
? ? 》commons-logging-1.1.1.jar
? ? 》ezmorph-1.0.3.jar
? ? 》json-lib-2.1-jdk15.jar????????????
?? (1)JavaBean----->JSON
???????? ??? 》JSONArray jsonArray = JSONArray.fromObject(city);
???????? ??? 》String jsonJAVA = jsonArray.toString();
?? (2)List<JavaBean>----->JSON
? ? ? ? ? ? ?》JSONArray jsonArray = JSONArray.fromObject(cityList);
???????? ??? 》String jsonJAVA = jsonArray.toString();
?? (3)List<String>----->JSON
? ? ? ? ? ? ?》JSONArray jsonArray = JSONArray.fromObject(stringList);
???????? ??? 》String jsonJAVA = jsonArray.toString();
?? (4)Set<JavaBean>----->JSON
? ? ? ? ? ? ?》JSONArray jsonArray = JSONArray.fromObject(citySet);
???????? ??? 》String jsonJAVA = jsonArray.toString();
?? (5)Map<String,Object>----->JSON
? ? ? ? ? ? ?》JSONArray jsonArray = JSONArray.fromObject(map);
???????? ??? 》String jsonJAVA = jsonArray.toString();
??????? 最后一個(gè)例子切記,將來(lái)jQuery-EasyUI-DataGrid組件時(shí)我們還要用到
??????? 將來(lái),在企業(yè)中,就算脫離struts2的環(huán)境,也能用第三方工具,將Java類型轉(zhuǎn)成JSON文本
/*** 城市* @author AdminTC*/ public class City {private Integer id;private String name;public City(){}public City(Integer id, String name) {this.id = id;this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;} } /*** 省份* @author AdminTC*/ public class Province {private Integer id;//編號(hào)private String name;//名字private List<City> cityList = new ArrayList<City>();public Province(){}public Province(Integer id, String name, List<City> cityList) {this.id = id;this.name = name;this.cityList = cityList;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<City> getCityList() {return cityList;}public void setCityList(List<City> cityList) {this.cityList = cityList;} }?
package cn.itcast.javaee.js.bean2json;import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set;import net.sf.json.JSONArray;/*** 使用第三方工具,將JavaBean對(duì)象/List或Set或Map對(duì)象轉(zhuǎn)成JSON * @author AdminTC*/ public class TestBean2Json {private static void javabean2json() {City city = new City(1,"廣州");JSONArray jSONArray = JSONArray.fromObject(city);String jsonJAVA = jSONArray.toString();System.out.println(jsonJAVA);//[{"id":1,"name":"廣州"}] }private static void list2json() {List<City> cityList = new ArrayList<City>();cityList.add(new City(1,"廣州"));cityList.add(new City(2,"珠海"));JSONArray jSONArray = JSONArray.fromObject(cityList);String jsonJAVA = jSONArray.toString();System.out.println(jsonJAVA);//[{"id":1,"name":"廣州"},{"id":2,"name":"珠海"}] }private static void set2json() {Set<City> citySet = new LinkedHashSet<City>();citySet.add(new City(1,"廣州"));citySet.add(new City(2,"珠海"));JSONArray jSONArray = JSONArray.fromObject(citySet);String jsonJAVA = jSONArray.toString();System.out.println(jsonJAVA);//[{"id":1,"name":"廣州"},{"id":2,"name":"珠海"}] }private static void javabeanlist2json() {List<City> cityList = new ArrayList<City>();cityList.add(new City(1,"中山"));cityList.add(new City(2,"佛山"));Province province = new Province(1,"廣東",cityList);JSONArray jSONArray = JSONArray.fromObject(province);String jsonJAVA = jSONArray.toString();System.out.println(jsonJAVA);/*[{"id":1,"name":"廣東""cityList":[{"id":1,"name":"中山"},{"id":2,"name":"佛山"}],}]*/}private static void map2json() {List<City> cityList = new ArrayList<City>();cityList.add(new City(1,"中山"));cityList.add(new City(2,"佛山"));Map<String,Object> map = new LinkedHashMap<String,Object>();map.put("total",cityList.size());//表示集合的長(zhǎng)度map.put("rows",cityList);//rows表示集合 JSONArray jSONArray = JSONArray.fromObject(map);String jsonJAVA = jSONArray.toString();System.out.println(jsonJAVA);//[{"total":2,"rows":[{"id":1,"name":"中山"},{"id":2,"name":"佛山"}]}] jsonJAVA = jsonJAVA.substring(1,jsonJAVA.length()-1);System.out.println(jsonJAVA);}public static void main(String[] args) {//javabean2json();//list2json();//set2json();//javabeanlist2json(); map2json();} }
?
四)總結(jié)JSON的特點(diǎn)
?? (1)在客戶端(特指PC瀏覽器),直接使用JavaScript語(yǔ)言解析JSON,無(wú)需第三方j(luò)ar包
?? (2)本質(zhì)上,就是一個(gè)文本,只是該文本有特定的書(shū)寫(xiě)格式
?? (3)可以使用第三方工具,將JavaBean對(duì)象或者List/Set/Map<JavaBean>對(duì)象轉(zhuǎn)成JSON
?? (4)優(yōu)點(diǎn):JSON與XML很相似,但是它更加輕巧,服務(wù)器只需發(fā)送一個(gè)html普通字符串,不用發(fā)送復(fù)雜的xml格式文檔了
?? (5)缺點(diǎn):語(yǔ)法過(guò)于嚴(yán)謹(jǐn),初學(xué)者可能覺(jué)得代碼不易讀,寫(xiě)錯(cuò)一點(diǎn)都不行
?? (6)JSON本質(zhì)上,就是用JS語(yǔ)法寫(xiě)的特殊文本記號(hào),用JS可以直接解析
轉(zhuǎn)載于:https://www.cnblogs.com/lxboy2009/p/6395713.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的JSON,java对象转json的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: centos6下jbd2进程占用大量IO
- 下一篇: 航发动力是地方国企还是央企