Json遇到引號需要轉義的問題


首先看一個簡單的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中方法,視項目的大小而定,一般說來,功能比較多,數據庫牽扯到外鍵的,或者數據內容多樣化的,最好可以采取后面兩種方式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM