首先看一個簡單的Json格式的數據:
{data:{id:1,text:"this is text",src:"abc/abc/abc.png"},success:true}
當使用Json數據向前端傳遞數據的時候,如果數據中出現引號的時候,如果不能轉義,那么前台,就會獲取一個錯誤的Json格式的數據,例如有這么一個對象Person:
class Person{ private String name; private String desc; public String getName(){ return name; } public void setName(String name){ this.name = name; } public String getDesc(){ return desc; } public void setDecs(String decs){ this.decs= decs; } }
如果有個Person對象person,他的desc是 he is Super Man,他的name是Jone
那么如果我們需要將這個對象轉化為Json數據傳遞給前台,那么我們有很多種方法:
1,最靈活的方式,當然是拼接了:
StringBuffer buffer = new StringBuffer(); buffer.append("{data:{'name':'"person.getName()+"','desc':'"person.getDesc()+"'},success:true}"); return buffer.toString();
這樣的話,前台拿到的數據就是{data:{'name':'Jone','desc':'he is Super Man'},success:true} 這個當然沒問題;
但是如果在desc中出現引號,例如 he is 'Super Man',如果依舊采用上面這種方式,那么拼接出來的數據是這樣子的:
{data:{'name':'Jone','desc':'he is 'Super Man''},success:true} 這樣子的話,就不是標准的json格式的數據了,前台就不能正確的解析了。
PS,有人說,那大不了不用單引號,用雙引號作為Json格式的拼接符,就可以了么?那如果數據中是雙引號呢:{data:{"name":"Jone","desc":'he is "Super Man""},success:true}
甚至,如果在數據的末尾出現轉義斜杠\怎么辦!{data:{'name':'Jone\','desc':'he is \'Super Man\''},success:true}
這樣的話,第一中方式就不適用了,那么可以看看下面這種:
2,使用序列化工具JSONSerializer,需要jar包:flexjson.jar
Person person = new Person(); person.setName("Jone"); person.setDesc(new StringBuffer().append("he is ").append('"').append("Super Man").append('"').toString()); JSONSerializer serializer = new JSONSerializer(); System.out.println(serializer.serialize(person));
這樣的話,序列化之后的數據是這樣的:
{"class":"test.Person","desc":"he is \"Super Man\"","name":"Jone"}
這樣的數據,已經被轉義過了,在前台就可以被正確的解析了。
但是這種方式靈活性比較差,
例如,如過前台需要的數據,除了desc,name兩個字段之外,還有需要person.address或者,其他需要處理的數據,那么第二中方式也就不可以了,那么可以采用下面這種方式:
3,使用JSONObject對象,這個需要jar包:ezmorph.jar,json-lib.jar,xom.jar
方式為:
HashMap<String,Object> map = new HashMap<String,Object>(); map.put("name",person.getName()); map.put("decs",person.getDesc()); map.put("age",22); map.put("home.address","street,road,china"); return JSONObject.fromObject(map).toString();
這樣,結果為:{"home.address":"street,road,china","decs":"he is \"Super Man\"","name":"Jone","age":22},也是標准的數據。
使用最后這種方式,不僅使得json數據可以得到轉義,而且,json數據內容處理更加靈活多樣。
以上3中方法,視項目的大小而定,一般說來,功能比較多,數據庫牽扯到外鍵的,或者數據內容多樣化的,最好可以采取后面兩種方式。
