您的位置:首页 > Web前端 > JavaScript

Json遇到引号需要转义的问题

2014-06-06 17:56 375 查看
首先看一个简单的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中方法,视项目的大小而定,一般说来,功能比较多,数据库牵扯到外键的,或者数据内容多样化的,最好可以采取后面两种方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: