因爲這個項目一直在用IE8開發,所以經常遇到很多問題,最近呢,偶然遇到一個json的問題,雖然用evel()函數變形後可以轉換,但是想看看其他的方法,所以就去度娘去治IE這個熊孩子了蒐集到了一些方法,下面列舉一下,並且在文章末尾都加上了原文出處
先說一下JAVA的
一、JASSONArray轉爲JSONObject
JSONArray result_type = new JSONArray();
StringBuffer cdsIdxType = new StringBuffer();
cdsIdxType.append(" select id from table_type ");
result_type = jdbcTemp.queryForJSONArray(cdsIdxType.toString());
JSONObject jsonObject = (JSONObject) result_type.get(i);
二、JASONArray轉爲List
JSONArray result_type = new JSONArray();
StringBuffer cdsIdxType = new StringBuffer();
cdsIdxType.append(" select id from table_type ");
result_type = jdbcTemp.queryForJSONArray(cdsIdxType.toString());
ArrayList list_type = new ArrayList();
for (int i = 0; i < result_type.size(); i++) {
JSONObject jsonObject = (JSONObject) result_type.get(i);
list_type.add(jsonObject.get("id"));
}
三、JSONArray轉爲String
JSONArray result_type = new JSONArray();
StringBuffer cdsIdxType = new StringBuffer();
cdsIdxType.append(" select id from table_type ");
result_type = jdbcTemp.queryForJSONArray(cdsIdxType.toString());
String typeAll = "";
ArrayList list_type = new ArrayList();
for (int i = 0; i < result_type.size(); i++) {
JSONObject jsonObject = (JSONObject) result_type.get(i);
list_type.add(jsonObject.get("id"));
}
for(int j=0;j<list_type.size();j++){
typeAll = typeAll + "'" + list_type.get(j) + "'" + ",";
}
typeAll = typeAll.substring(0, typeAll.length() -1);
四、String轉換爲ArrayList
String tablecode = request.getParameter("tablecode");
tablecode = tablecode.substring(1, tablecode.length()-1).replace("\"", "");
String[] list = tablecode.split(",");
ArrayList tables = new ArrayList();
for(int i=0; i<list.length; i++){
tables.add(list[i]);
}
五.String轉JSONObject
String jsonMese = "{\"語文\":\"88\",\"數學\":\"78\",\"計算機\":\"99\"}";
JSONObject myJson = JSONObject.fromObject(jsonMese);
六.String轉JSONArray
String jsonMessage = "[{'num':'成績', '外語':88, '歷史':65, '地理':99, 'object':{'aaa':'1111','bbb':'2222','cccc':'3333'}}," + "{'num':'興趣', '外語':28, '歷史':45, '地理':19, 'object':{'aaa':'11a11','bbb':'2222','cccc':'3333'}}," + "{'num':'愛好', '外語':48, '歷史':62, '地理':39, 'object':{'aaa':'11c11','bbb':'2222','cccc':'3333'}}]";
JSONArray myJsonArray = JSONArray.fromObject(jsonMessage);
七.String轉數組
String string = "a,b,c"; String [] stringArr= string.split(","); //注意分隔符是需要轉譯
如果是"abc"這種字符串,就直接
String string = "abc" ; char [] stringArr = string.toCharArray(); //注意返回值是char數組 如果要返回byte數組就直接使用getBytes方法就ok了
String string = "abc" ; byte [] stringArr = string.getBytes();
八、數組轉String
char[] data={a,b,c};
String s=new String(data);
原文出處:點擊查看
---*******************************************************我是分割線**************************************************************---
下面簡單說一下JS的
先說IE8的問題
起因:
JSON是包含在JScript 5.8中,而爲了向下兼容ie8只有在文檔模式是”Internet Explorer 8 Standards”的時候才使用JScripte 5.8,其他時候使用JScripte 5.7特性。因此如果文檔模式沒有聲明爲”Internet Explorer 8 Standards”,ie8是找不到JSON對象的。因爲沒有兼容到ie6/7,所以必然在ie6/7中,JSON會出現未定義的問題。我項目中採用的是方法1,完美解決。
解決方法:
引入定義json的文件json2.js,
下載地址:https://github.com/douglascrockford/JSON-js
引入包含json的jquery文件。
如果不用兼容到ie6/7,只需要聲明”Internet Explorer 8 Standards”模式,方法如下:
- 在文檔頭中添加<meta http-equiv="X-UA-Compatible" content="IE=8" >
- 使用<!DOCTYPE>來聲明文檔
原文出處:點擊查看3
---*********我是小分割線********---
在JS中JSON的轉換問題以及方法
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。因爲採用獨立於語言的文本格式,也使用了類似於C語言家族的習慣,擁有了這些特性使使JSON稱爲理想的數據交換語言,作用是易於閱讀和編寫,同時也易於機器解析和生成(一般用於網絡傳輸速率)。
(1)JSON.parse函數
作用:將json字符串轉換成json對象。
語法:JSON. parse(text[,reviver]).
參數:text 必須;一個有效的json字符串。
reviver 可選。
返回值:一個對象或數組。
example:
(2)JSON.stringify()函數
作用:將json對象轉換成json字符串。
語法:JSON.stringify(value [, replacer] [, space])
參數:value 必須;通常爲對象或數組。
replacer 可選,用於轉換結果的函數或者數組。
space 可選。向返回值 JSON 文本添加縮進、空格和換行符以使其更易於讀取。
返回值:一個包含JSON文本的字符串。
example:
(3) eval()函數
作用:eval()函數可計算某個字符串,並執行其中的javascript表達式或要執行的語句。
語法:eval(string)
參數: string 必須,需要計算的字符串,其中含有要計算的javascript表達式或要執行的語句。
返回值:返回計算string的值,沒有的話不做任何改變返回。
example:
使用eval()函數也可以將JSON字符串解析爲對象,這個功能能完成JSON.parse()的功能,但是有不一樣的地方,請看下面代碼 :
不知道大家有木有注意到eval()還要用一對圓括號將字符串包起來,對此我尋找到比較好的解釋就是:
原因:歸結於eval本身的問題,由於json是以”{}”的方式來開始以及結束的,在JS中,它會被當成一個語句塊來處理,所以必須強制性的將它轉換成一種表達式。
解決方法:加上圓括號的目的是迫使eval函數在處理JavaScript代碼的時候強制將括號內的表達式(expression)轉化爲對象,而不是作爲語句(statement)來執 行。舉一個例子,例如對象字面量{},如若不加外層的括號,那麼eval會將大括號識別爲JavaScript代碼塊的開始和結束標記,那麼{}將會被認爲是執行了一句空語 句。請看下列例子的不同:
======================================下面舉一個在實際開發中的小例子================================
一:組合參數
二:傳遞參數
三 :解析參數
最後附上js中獲取URL參數的共通方法getRequest()方法:
getRequest : function() {
var url = location.search; //獲取url中"?"符後的字串
var theRequest = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
strs = str.split("&");
for(var i = 0; i < strs.length; i ++) {
theRequest[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);
}
}
return theRequest;
}
原文出處:點擊查看1
---*********************************************************我也是分割線***************************************************************---
下面的這個文章是在JS中對JSON對象的辯證
(我感覺是這樣的,暫時這樣稱呼好了)
前言
寫這篇文章的目的是經常看到開發人員說:把字符串轉化爲JSON對象,把JSON對象轉化成字符串等類似的話題,所以把之前收藏的一篇老外的文章整理翻譯了一下,供大家討論,如有錯誤,請大家指出,多謝。
正文
本文的主題是基於ECMAScript262-3來寫的,2011年的262-5新規範增加了JSON對象,和我們平時所說的JSON有關係,但是不是同一個東西,文章最後一節會講到新增加的JSON對象。
英文原文:http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/
我想給大家澄清一下一個非常普遍的誤解,我認爲很多JavaScript開發人員都錯誤地把JavaScript對象字面量(Object Literals)稱爲JSON對象(JSON Objects),因爲他的語法和JSON規範裏描述的一樣,但是該規範裏也明確地說了JSON只是一個數據交換語言,只有我們將之用在string上下文的時候它才叫JSON。
序列化與反序列化
2個程序(或服務器、語言等)需要交互通信的時候,他們傾向於使用string字符串因爲string在很多語言裏解析的方式都差不多。複雜的數據結構經常需要用到,並且通過各種各樣的中括號{},小括號(),叫括號<>和空格來組成,這個字符串僅僅是按照要求規範好的字符。
爲此,我們爲了描述這些複雜的數據結構作爲一個string字符串,制定了標準的規則和語法。JSON只是其中一種語法,它可以在string上下文裏描述對象,數組,字符串,數字,布爾型和null,然後通過程序間傳輸,並且反序列化成所需要的格式。YAML和XML(甚至request params)也是流行的數據交換格式,但是,我們喜歡JSON,誰叫我們是JavaScript開發人員呢!
字面量
引用Mozilla Developer Center裏的幾句話,供大家參考:
- 他們是固定的值,不是變量,讓你從“字面上”理解腳本。 (Literals)
- 字符串字面量是由雙引號(")或單引號(')包圍起來的零個或多個字符組成的。(Strings Literals)
- 對象字面量是由大括號({})括起來的零個或多個對象的屬性名-值對。(Object Literals)
何時是JSON,何時不是JSON?
JSON是設計成描述數據交換格式的,他也有自己的語法,這個語法是JavaScript的一個子集。
{ "prop": "val" } 這樣的聲明有可能是JavaScript對象字面量也有可能是JSON字符串,取決於什麼上下文使用它,如果是用在string上下文(用單引號或雙引號引住,或者從text文件讀取)的話,那它就是JSON字符串,如果是用在對象字面量上下文中,那它就是對象字面量。
// 這是JSON字符串
var foo = '{ "prop": "val" }';
// 這是對象字面量
var bar = { "prop": "val" };
而且要注意,JSON有非常嚴格的語法,在string上下文裏{ "prop": "val" } 是個合法的JSON,但{ prop: "val" }和{ 'prop': 'val' }確實不合法的。所有屬性名稱和它的值都必須用雙引號引住,不能使用單引號。另外,即便你用了轉義以後的單引號也是不合法的,詳細的語法規則可以到這裏查看。
放到上下文裏來看
大傢伙可能嗤之以鼻:難道JavaScript代碼不是一個大的字符串?
當然是,所有的JavaScript代碼和HTML(可能還有其他東西)都是字符串,直到瀏覽器對他們進行解析。這時候.jf文件或者inline的JavaScript代碼已經不是字符串了,而是被當成真正的JavaScript源代碼了,就像頁面裏的innterHTML一樣,這時候也不是字符串了,而是被解析成DOM結構了。
再次說一下,這取決於上下文,在string上下文裏使用帶有大括號的JavaScript對象,那它就是JSON字符串,而如果在對象字面量上下文裏使用的話,那它就是對象字面量。
真正的JSON對象
開頭已經提到,對象字面量不是JSON對象,但是有真正的JSON對象。但是兩者完全不一樣概念,在新版的瀏覽器裏JSON對象已經被原生的內置對象了,目前有2個靜態方法:JSON.parse用來將JSON字符串反序列化成對象,JSON.stringify用來將對象序列化成JSON字符串。老版本的瀏覽器不支持這個對象,但你可以通過json2.js來實現同樣的功能。
如果還不理解,別擔心,參考一下的例子就知道了:
// 這是JSON字符串,比如從AJAX獲取字符串信息
var my_json_string = '{ "prop": "val" }';
// 將字符串反序列化成對象
var my_obj = JSON.parse( my_json_string );
alert( my_obj.prop == 'val' ); // 提示 true, 和想象的一樣!
// 將對象序列化成JSON字符串
var my_other_json_string = JSON.stringify( my_obj );
另外,Paul Irish提到Douglas Crockford在JSON RFC裏用到了“JSON object”,但是在那個上下文裏,他的意思是“對象描述成JSON字符串”不是“對象字面量”。
更多資料
如果你想了解更多關於JSON的資料,下面的連接對你絕對有用:
- JSON specification
- JSON RFC
- JSON on Wikipedia
- JSONLint - The JSON Validator
- JSON is not the same as JSON
同步與推薦
本文已同步至目錄索引:深入理解JavaScript系列
深入理解JavaScript系列文章,包括了原創,翻譯,轉載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。
一般返回json數據時用到
var plist= JSON.parse(JSON.stringify(data.relist));
原文出處:點擊查看2