在做與伺服器互動資料的時候,我們通常會發起乙個ajax請求,然後伺服器返回乙個類似''結構的json字串,為了方便客戶端處理我們會將其轉換為乙個物件直接量
這很多的時候通過乙個eval來實現
var jsonstr = '';
var jsonobj = eval('(' + jsonstr + ')');
如果eval的時候不加括號還會報指令碼錯誤,這是為什麼呢?
因為eval中 是乙個執行環境,當你不用括號的時候整個被解釋成乙個復合語句,在這裡就是乙個符合語句的分隔符,而不是我們原本認為的物件直接量的一種語法方式。就像我們通常寫if(true)這裡的大括號也是充當著復合語句的作用。
接下來x:被解釋成標籤,像通常用的swicth case語句中的case x:也是一種標籤,至於標籤的其他用法可以參考相關資料。後面的1被當做乙個數字直接量
遇到y被解釋成變數標示符,然後再繼續解析y後的冒號時就出錯了,因為無法識別。所以如果你寫成eval('')就不會報錯了,因為y=1是可以被識別的, y=1後eval的結果是返回1。
但是為什麼前後加個括號就可以了呢,因為括號在這裡表示強制執行,整個'(' + jsonstr + ')'其實被解釋成乙個表示式運算,而不是乙個復合語句,因此jsonstr中的大括號{}被當成物件的語法來識別,當然就可以了。
說完了上面,我們再來看乙個例子,如果我們寫eval('')這樣呢,這會報錯嗎?
答案是不會,因為雖然被認為是乙個復合語句,但是x:1這樣的寫法是沒錯的,當做標籤來識別,因此結果返回1 ,說白了只要讓所表示的復合語句不讓解析不能理解就可以了,如不會報錯,返回最後的結果3
json特殊字串處理
json語法要求很嚴格,如果你在傳遞json字串的時候,包含了特殊字元,如 空格 回車 換行 製表。那麼在用jsonobject.fromobject 轉換時,就會報 json exception unterminated string at character這樣的錯誤。解決辦法就是,在你轉換js...
Json和字串的處理
1 既可以去重複,又可以排序 settimelist new treeset 2 這要是一種排序 map result newtreemap new comparator 3 獲得string中的資料,並封裝成乙個物件 gson gson newgson list temperature newar...
使用Gson處理json字串
test public void test01 gettype list list gson.fromjson json,type for listlists list 這裡我是把乙個二維陣列處理成立成乙個list 物件 下面是我使用gson將json字串轉換為物件的兩種方式 第一種 public ...