加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

转:解决json参数中有参数是url地址导致json无法正确传输与解析

(2016-03-11 18:06:51)
分类: jquery

假如你有一段json字串是这样的。

  1.  
  2.     "url": "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=json&rsv_spt=1&oq=timebell&rsv_pq=9eb74c860000febd&rsv_t=9a4fMaQSgnD3kSNW0W8qKe4UqdLktZJC9AzJCdV1WJ4+oJq682zgd/Ycu+JYndnDmUgq&rsv_enter=1&rsv_sug3=5&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&inputT=1262&rsv_sug4=1263&rsv_sug=2 
  3.   
  4.  



那么你传输到后台或者到jsp页面的时候,你就会发现这简直是坑爹。

因为传输的过程中,&符号会导致json被拦腰截断。就是说你后台或前台能接受到的数据就是这样的

  1.  
  2.     "url": "https://www.baidu.com/s?ie=utf-8  

看到这数据,瞬间傻眼,博主第一次遇到这种情况,彻底方了 T_T。

然后上网查阅后,发现博主果然还是小菜鸟一只。因为这种情况网上早有解决方案了。没错,就是进行url编码就可以了。


只要我们前端js用encodeURIComponent对url地址进行编码就可以了。


我们写一个方法:

  1. function myencodeURI(str){  
  2.      return  encodeURIComponent(encodeURIComponent(str));  
  3.  

然后拼接json串的时候,我们可以对
  1. https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=json&rsv_spt=1&oq=timebell&rsv_pq=9eb74c860000febd&rsv_t=9a4fMaQSgnD3kSNW0W8qKe4UqdLktZJC9AzJCdV1WJ4+oJq682zgd/Ycu+JYndnDmUgq&rsv_enter=1&rsv_sug3=5&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&inputT=1262&rsv_sug4=1263&rsv_sug=2  

调用myencodeURI方法进行编码。

然后你会发现里面的特殊符号都变成了%+两个16进制的玩意。

接下来分两种情况:

1.你是把这json从jsp传输到另一个jsp页面。

接受到这json串的页面,你在解析为json对象之前,要先用decodeURIComponent(str)来进行解码,然后这json串又变成了我们原先的json串了。然后我们就可以调用JSON.parse(str).来进行解析成json对象。


2.你是把这json 串发送到后台。


我java后台是这样接受的

  1. JSONObject obj new JSONObject().fromObject(data);//将json字符串转换为json对象  
  2.         WBQEncode_Decoder.my_decode_v2(obj);//用这个工具类的方法来解码  
  3.         Testdto (Testdto )JSONObject.toBean(obj, Testdto .classclassMap);//将建json对象转换为Testdto 对象  
  1. import java.io.IOException;  
  2. import java.net.URLDecoder;  
  3. import java.net.URLEncoder;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7. import java.util.Set;  
  8.   
  9. import net.sf.json.JSONArray;  
  10. import net.sf.json.JSONObject;  
  11. //反解码 处理URL特殊字符的工具类  
  12. public class WBQEncode_Decoder  
  13.   
  14.     public static void my_decode_v2(Object object) throws Exception  
  15.         if (object instanceof JSONObject) {// 是对象  
  16.             JSONObject jsonObject (JSONObject) object;  
  17.             handleJsonObject(jsonObject);  
  18.         else if (object instanceof JSONArray) {// 是对象  
  19.             JSONArray jsonArray (JSONArray) object;  
  20.             int length jsonArray.size();  
  21.             for (int 0length; i++)  
  22.                 JSONObject jsonObject (JSONObject) jsonArray.get(i);  
  23.                 handleJsonObject(jsonObject);  
  24.                 jsonArray.set(i, jsonObject);  
  25.              
  26.   
  27.          
  28.      
  29.   
  30.     public static void my_encode_v2(Listlist)  
  31.             throws IOException  
  32.         if (list == null || list.isEmpty())  
  33.             return 
  34.          
  35.         for (Iteratoriterator list.iterator(); iterator  
  36.                 .hasNext();)  
  37.             Map map iterator.next();  
  38.             Set keys map.keySet();  
  39.             for (Iterator iterator2 keys.iterator(); iterator2  
  40.                     .hasNext();)  
  41.                 String key iterator2.next();  
  42.                 Object object map.get(key);  
  43.                 if (object == null || object instanceof String  
  44.                         || object instanceof Number)  
  45.                     if (object == null 
  46.                         object "" 
  47.                      
  48.                     String value object.toString();  
  49.                     if (value.equals("null"|| value.equals("undefined"))  
  50.                         value "" 
  51.                      
  52.                     value URLEncoder.encode(value, "utf-8");  
  53.                     value value.replaceAll("\\+""百分之20(直接写的话博客上看不到)");// 其实+号是URLEncoder.encode后把空格转成+了,在页面上解码的时候是把空格当作了,所以要把+替换成  
  54.   
  55.                     map.put(key, value);  
  56.                  
  57.   
  58.              
  59.          
  60.      
  61.   
  62.     public static void main(String[] args) throws IOException  
  63.   
  64.         String value "http://www.w3school.com.cn/My first /" 
  65.         value value.replaceAll("\\+"");  
  66.         System.out.println(value);  
  67.      
  68.   
  69.     @SuppressWarnings("unchecked" 
  70.     private static void handleJsonObject(JSONObject jsonObject)  
  71.             throws Exception  
  72.         Set keys jsonObject.keySet();  
  73.         for (Iterator iterator keys.iterator(); iterator.hasNext();)  
  74.             String key iterator.next();  
  75.             String objectStr jsonObject.get(key).toString();  
  76.             if ((objectStr.startsWith("{"&& objectStr.endsWith("}")))  
  77.                 my_decode_v2(JSONObject.fromObject(objectStr));  
  78.             else if (objectStr.startsWith("["&& objectStr.endsWith("]"))  
  79.                 JSONArray jay JSONArray.fromObject(objectStr);  
  80.                 my_decode_v2(jay);  
  81.                 jsonObject.put(key, jay);  
  82.             else  
  83.                 objectStr URLDecoder.decode(objectStr, "utf-8");  
  84.                 if (objectStr.equals("null"|| objectStr.equals("undefined"))  
  85.                     objectStr "" 
  86.                  
  87.                 jsonObject.put(key, objectStr);  
  88.              
  89.          
  90.      
  91.  

就这样搞定了。有错误的话,还希望各位同行指出来,一起学习进步。

转自我自己的csdn:http://blog.csdn.net/c466254931/article/details/50857930

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有