首先看一个简单的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中方法,视项目的大小而定,一般说来,功能比较多,数据库牵扯到外键的,或者数据内容多样化的,最好可以采取后面两种方式。