JS以及JAVA中有關JSON類型的互轉以及一些思考的問題

因爲這個項目一直在用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,然後通過程序間傳輸,並且反序列化成所需要的格式。YAMLXML(甚至request params)也是流行的數據交換格式,但是,我們喜歡JSON,誰叫我們是JavaScript開發人員呢!

字面量

引用Mozilla Developer Center裏的幾句話,供大家參考:

  1. 他們是固定的值,不是變量,讓你從“字面上”理解腳本。 (Literals)
  2. 字符串字面量是由雙引號(")或單引號(')包圍起來的零個或多個字符組成的。(Strings Literals)
  3. 對象字面量是由大括號({})括起來的零個或多個對象的屬性名-值對。(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的資料,下面的連接對你絕對有用:

同步與推薦

本文已同步至目錄索引:深入理解JavaScript系列

深入理解JavaScript系列文章,包括了原創,翻譯,轉載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。

一般返回json數據時用到

var plist= JSON.parse(JSON.stringify(data.relist));

 

原文出處:點擊查看2

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