簡單描述JSON跟JSONP的區別、jsonp的java使用

JSON和JSONP雖然只有一個字母的差別,但其實他們根本不是一回事兒:JSON是一種數據交換格式,而JSONP是一種依靠開發人員的聰明才智創造出的一種非官方跨域數據交互協議。

JSON的優點:

1、基於純文本,跨平臺傳遞極其簡單;

2、Javascript原生支持,後臺語言幾乎全部支持;

3、輕量級數據格式,佔用字符數量極少,特別適合互聯網傳遞;

4、可讀性較強,雖然比不上XML那麼一目瞭然,但在合理的依次縮進之後還是很容易識別的;

5、容易編寫和解析,當然前提是你要知道數據結構;

JSON的缺點當然也有,但在小編看來實在是無關緊要的東西,所以不再單獨說明。

JSON能夠以非常簡單的方式來描述數據結構,XML能做的它都能做,因此在跨平臺方面兩者完全不分伯仲。

1、JSON只有兩種數據類型描述符,大括號{}和方括號[],其餘英文冒號:是映射符,英文逗號,是分隔符,英文雙引號""是定義符。

2、大括號{}用來描述一組“不同類型的無序鍵值對集合”(每個鍵值對可以理解爲OOP的屬性描述),方括號[]用來描述一組“相同類型的有序數據集合”(可對應OOP的數組)。

3、上述兩種集合中若有多個子項,則通過英文逗號,進行分隔。

4、鍵值對以英文冒號:進行分隔,並且建議鍵名都加上英文雙引號"",以便於不同語言的解析。

5、JSON內部常用數據類型無非就是字符串、數字、布爾、日期、null 這麼幾個,字符串必須用雙引號引起來,其餘的都不用,日期類型比較特殊,這裏就不展開講述了,只是建議如果客戶端沒有按日期排序功能需求的話,那麼把日期時間直接作爲字符串傳遞就好,可以省去很多麻煩。

先說說JSONP是怎麼產生的:

其實網上關於JSONP的講解有很多,但卻千篇一律,而且雲裏霧裏,對於很多剛接觸的人來講理解起來有些困難,小編不才,試着用自己的方式來闡釋一下這個問題,看看是否有幫助。

1、一個衆所周知的問題,Ajax直接請求普通文件存在跨域無權限訪問的問題,甭管你是靜態頁面、動態網頁、web服務、WCF,只要是跨域請求,一律不準。

2、不過我們又發現,Web頁面上調用js文件時則不受是否跨域的影響(不僅如此,我們還發現凡是擁有"src"這個屬性的標籤都擁有跨域的能力,比如<script>、<img>、<iframe>)。

3、於是可以判斷,當前階段如果想通過純web端(ActiveX控件、服務端代理、屬於未來的HTML5之Websocket等方式不算)跨域訪問數據就只有一種可能,那就是在遠程服務器上設法把數據裝進js格式的文件裏,供客戶端調用和進一步處理。

4、恰巧我們已經知道有一種叫做JSON的純字符數據格式可以簡潔的描述複雜數據,更妙的是JSON還被js原生支持,所以在客戶端幾乎可以隨心所欲的處理這種格式的數據。

5、這樣子解決方案就呼之欲出了,web客戶端通過與調用腳本一模一樣的方式,來調用跨域服務器上動態生成的js格式文件(一般以JSON爲後綴),顯而易見,服務器之所以要動態生成JSON文件,目的就在於把客戶端需要的數據裝入進去。

6、客戶端在對JSON文件調用成功之後,也就獲得了自己所需的數據,剩下的就是按照自己需求進行處理和展現了,這種獲取遠程數據的方式看起來非常像AJAX,但其實並不一樣。

7、爲了便於客戶端使用數據,逐漸形成了一種非正式傳輸協議,人們把它稱作JSONP,該協議的一個要點就是允許用戶傳遞一個callback參數給服務端,然後服務端返回數據時會將這個callback參數作爲函數名來包裹住JSON數據,這樣客戶端就可以隨意定製自己的函數來自動處理返回數據了。

如果對於callback參數如何使用還有些模糊的話,我們後面會有具體的實例來講解。


以上都摘自原文的一些關鍵,以後用到多了一些理解在進行記錄,目前關於我的一些理解,由於文筆不好,原文可能更詳細,

原文地址:http://www.qixing318.com/article/simply-describe-the-difference-between-json-with-json-as-well-as-the-actual-combat.html

下面我補充一些jsonp的java使用代碼;

ajax跨域請求js代碼:

$.ajax({
		url:requestURL+"/dcdata/text/listTitle",
		data: {},
		type:'get',
		async : true, //默認爲true 異步
		jsonp:"callback",
		dataType: 'jsonp',
		jsonpCallback: "titleCallback",
		error:function(){
			
		},
		success:function(ret){
			
		}
	});
java端代碼:
@GetMapping("/listTitle")
	public ResponseEntity<String> listTitle(
			@RequestParam(name="page",defaultValue="1")  Integer page,
			@RequestParam(name="rows",defaultValue="10")  Integer rows
			,String callback ){
			PageInfo<Novel> novels=novelService.getListTitleByPage(page,rows);
		 if (StringUtil.isNotEmpty(callback )) {
			 logger.info("跨域請求");
	            //返回js文件需要的格式
			 HttpHeaders responseHeaders = new HttpHeaders();
		     responseHeaders.set("Content-Type", "text/plain;charset=utf-8");
	         return new ResponseEntity<String>((callback + "(" + JSON.toJSONString(success(novels)) + ")"),responseHeaders,HttpStatus.OK);
	        }
		return new ResponseEntity<String>(JSON.toJSONString(success(novels)),HttpStatus.OK);
	}
此種方式的缺點:必須修改服務器代碼使其支持跨域請求;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章