閱讀78 返回首頁    go 阿裏雲 go 技術社區[雲棲]


JSON轉換方法總結

將JavaScript的jQuery庫中表單轉化為JSON對象的方法

Jquery中有serialize方法,可以將表單序列化為一個“&”連接的字符串,但卻沒有提供序列化為Json的方法。不過,我們可以寫一個插件實現。

有人用替換的方法,先用serialize序列化後,將&替換成“:”、“‘”:

jquery的 serialize()方法,可以對表單項進行序列化,這本來是很方便的一個功能;但是實際使用中有時會出現如下問題:

<input name="content" value="ddd 567"/>

在執行 serialize()方法後,得到的卻是 ddd+567這樣的字符串;即jquery的序列化方法對空格進行了轉義,轉換成了 + 號

解決方法:由於serialize()方法對真正的“+”號轉義的是 %2B,所以可以對serialize()後的結果進行符號替換

<script>
    var a= $('$frm1').serialize(); //序列化,默認會調用encodeURIComponent()進行編碼
    alert(a); // content=ddd+++567+++987
    var b = a.replace(/\\+/g," ");  // g表示對整個字符串中符合條件的都進行替換
    b = decodeURIComponent(b); //對serialize後的內容進行解碼
    alert(b); // content=ddd + 567 + 987
</script>

javascript中JSON對象與JSON字符串相互轉換

1.jQuery插件支持的轉換方式:

$.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以將json字符串轉換成json對象 

2.瀏覽器支持的轉換方式(Firefox,chrome,opera,safari,ie9,ie8)等瀏覽器:

JSON.parse(jsonstr); //可以將json字符串轉換成json對象 
JSON.stringify(jsonobj); //可以將json對象轉換成json對符串 

注:ie8(兼容模式),ie7和ie6沒有JSON對象,推薦采用JSON官方的方式,引入json.js。

3.Javascript支持的轉換方式:

eval('(' + jsonstr + ')'); //可以將json字符串轉換成json對象,注意需要在json字符外包裹一對小括號 

注:ie8(兼容模式),ie7和ie6也可以使用eval()將字符串轉為JSON對象,但不推薦這些方式,這種方式不安全eval會執行json串中的表達式

4.JSON官方的轉換方式:

https://www.json.org/提供了一個json.js,這樣ie8(兼容模式),ie7和ie6就可以支持JSON對象以及其stringify()和parse()方法;可以在https://github.com/douglascrockford/JSON-js上獲取到這個js,一般現在用json2.js

在開發的過程中,如果對於少量參數的前後台傳遞,可以直接采用ajax的data函數,按json格式傳遞,後台Request即可,但有的時候,需要傳遞多個參數,這樣後台接受的時候Request很多很麻煩,此時要按照類的格式或集合的形式進行傳遞

例如:前台按類的格式傳遞JSON對象:

var jsonUserInfo = "{\"TUserName\":\"" + userName + "\",\"TInterest\":\"" + interest + "\",\"TSex\":\"" + sex + "\",\"TCity\":\"" + city + "\",\"TDetail\":\"" + detail + "\"}"; 

如拚出的jsonUserInfo 無轉義符號,需要var jsonArrayFinal = JSON.stringify(jsonArray);進行轉換後再傳遞

如果前台傳遞多個類格式的JSON數組,也就是集合類型:

例如:[{"name":"a"},{"name","b"},{"name","c"}],則無法傳遞,此時必須使用JSON.stringify將數組對象轉換成字符串,再進行AJAX傳遞即可

JavaScript中字符串(string)轉json的方法

函數eval()

testJson=eval(testJson);是錯誤的轉換方式。正確的轉換方式需要加(): testJson = eval("(" + testJson + ")");

eval()的速度非常快,但是他可以編譯以及執行任何javaScript程序,所以會存在安全問題。在使用eval()。來源必須是值得信賴的。需要使用更安全的json解析器。在服務器不嚴格的編碼在json或者如果不嚴格驗證的輸入,就有可能提供無效的json或者載有危險的腳本,在eval()中執行腳本,釋放惡意代碼

function ConvertToJsonForJs() {
  //var testJson = "{ name: '小強', age: 16 }";(支持)
  //var testJson = "{ 'name': '小強', 'age': 16 }";(支持)
  var testJson = '{ "name": "小強", "age": 16 }';
  //testJson=eval(testJson);//錯誤的轉換方式
  testJson = eval("(" + testJson + ")");
  alert(testJson.name);
}

jquery.parseJSON()

使用jquery.parseJSON()方法對json的格式要求比較高,必須符合json格式

function ConvertToJsonForJq() {
  var testJson = '{ "name": "小強", "age": 16 }';
  //不知道
  //'{ name: "小強", age: 16 }' (name 沒有使用雙引號包裹)
  //"{ 'name': "小強", 'age': 16 }"(name使用單引號)
  testJson = $.parseJSON(testJson);
  alert(testJson.name);
}

很多時候我們需要組裝字符串為json對象,首先要組合字符串,然後轉換為json對象

var convertStringToJSON = function(){
    var str="{'ID':12,'Name':'Tom','Age':21}";
    var stu = eval('('+str+')');
    alert(stu.Name);
}

javascript中對象與字符串的互轉

對象轉為字符串:通過JSON.encode方法,這個是json.js裏麵的方法,引入到當前文件就可以了。

字符串轉換為對象:使用JSON.decode方法,同上,引入js就可以了。jQuery中有個方法,$.parseJson也可以實現

轉義字符(\\)對JavaScript中JSON.parse的影響

JSON是一個提供了stringify和parse方法的內置對象,前者用於將js對象轉化為符合json標準的字符串,後者將符合json標準的字符串轉化為js對象

一般來說在JSON.parse的參數包含轉移字符的時候會遇到兩次轉義的問題,其實第一次是字符串本身的轉義,第二次是將真正轉為js對象的轉義

舉例如下:

將字符串'{"a":"b","b":"\\"}'傳遞給JSON.parse,首先解析器提取單引號括起來的字符串時認為第一個\轉義第二個\ 第三個\轉義第四個\,也就是說實際可輸出字符串是{"a":"b","b":"\"}(可通過console.log('{"a":"b","b":"\\"}')驗證),之後正式轉為js對象的時候還有一次轉義,也就是實際輸出字符串中的第一個\轉義第二個\(此時隻有兩個\)。所以console.log(JSON.parse('{"a":"b","b":"\\"}') );輸出結果為Object {a: "b", b: "\"},也就是說實際顯示的數據為一個\(實際可輸出一個\說明在此之前還有一個\)

總結,如果想在js對象中出現一個\,需要在json字符串中出現四個\ 。

對於其他的其他的特殊字符

1.雙引號("),如果正確出現雙引號應為\\"

2.\n,如果想出現正確的換行需要json字符串中是\n,其實是先對\n中的\轉義,n變成了普通字符,在解析為js對象的時候n與之前的\(隻有一個\了)被解釋為換行。如下的兩個與此類似

3.\r,\r

4.\t,\t

JavaScript中json對象和string對象之間相互轉化

JSON:JavaScript 對象表示法(JavaScript Object Notation),其實JSON就是一個JavaScript的對象(Object)而已

轉換json格式的日期為Javascript對象的函數

項目中碰到了用jQuery從後台獲取的json格式的日期的字符串,需要將此字符串轉換成JavaScript的日期對象.

解決json日期格式問題的3種方法

開發中有時候需要從服務器端返回json格式的數據,在後台代碼中如果有DateTime類型的數據使用係統自帶的工具類序列化後將得到一個很長的數字表示日期數據

1.在服務器端將日期格式使用Select方法或LINQ表達式轉換後發到客戶端:

var studentSet = students.Select( 
    p => new { 
        Birthday = p.Birthday.ToString("yyyy-mm-dd") 
    } 
).ToList();

這時候的日期格式就已經變成友好格式了,不過在javascript中這隻是一個字符串

2.在javascript中將"Birthday":"\/Date(1391141532000)\/"中的字符串轉換成日期對象,可以將Birthday這個Key所對應的Value中的非數字字符以替換的方式刪除,得到一個數字1391141532000,然後實例化一個Date對象,將1391141532000毫秒作為參數,得到一個javascript中的日期對象

$.getJSON("getJson.ashx", function (students) {
    $.each(students, function (index, obj) {
        $("<li/>").html(obj.Name).appendTo("#ulStudents");
        var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));//使用正則表達式將生日屬性中的非數字(\D)刪除,並把得到的毫秒數轉換成數字類型
        var birthday = new Date(birthdayMilliseconds);//實例化一個新的日期格式,使用1970 年 1 月 1 日至今的毫秒數為參數
        $("<li/>").html(birthday.toLocaleString()).appendTo("#ulStudents"); ;
    });
 });

3.可以選擇第三方的json工具類,其中不乏有一些已經對日期格式問題已處理好了的

最後更新:2017-05-22 15:33:10

  上一篇:go  圖解 Java IO : 一、File源碼
  下一篇:go  關於集成建模,這有40個給數據科學家的技能測試題及解答