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

分类: jquery |
假如你有一段json字串是这样的。
-
{
-
"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=9a4fMaQSgnD3kSNW0W8qKe4U qdLktZJC9AzJCdV1WJ4 +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" -
-
}
那么你传输到后台或者到jsp页面的时候,你就会发现这简直是坑爹。
因为传输的过程中,&符号会导致json被拦腰截断。就是说你后台或前台能接受到的数据就是这样的
-
{
-
"url": "https://www.baidu.com/s?ie=utf-8
看到这数据,瞬间傻眼,博主第一次遇到这种情况,彻底方了 T_T。
然后上网查阅后,发现博主果然还是小菜鸟一只。因为这种情况网上早有解决方案了。没错,就是进行url编码就可以了。
只要我们前端js用encodeURIComponent对url地址进行编码就可以了。
我们写一个方法:
- function
myencodeURI(str){ -
return encodeURIComponent(encodeURIComponent(str)); -
}
然后拼接json串的时候,我们可以对
-
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=9a4fMaQSgnD3kSNW0W8qKe4U
qdLktZJC9AzJCdV1WJ4 +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后台是这样接受的
-
JSONObject
obj new= JSONObject().fromObject(data); //将json字符串转换为json对象 -
WBQEncode_Decoder.my_decode_v2(obj);//用这个工具类的方法来解码 -
Testdto = (Testdto )JSONObject.toBean(obj, Testdto .class, classMap); //将建json对象转换为Testdto对象
- import
java.io.IOException; - import
java.net.URLDecoder; - import
java.net.URLEncoder; - import
java.util.Iterator; - import
java.util.List; - import
java.util.Map; - import
java.util.Set; -
- import
net.sf.json.JSONArray; - import
net.sf.json.JSONObject; - //反解码
处理URL特殊字符的工具类 - public
class WBQEncode_Decoder { -
-
public static void my_decode_v2(Object throwsobject) Exception { -
if (object instanceofJSONObject) //{ 是对象 -
JSONObject jsonObject = (JSONObject) object; -
handleJsonObject(jsonObject); -
} else if (object instanceofJSONArray) //{ 是对象 -
JSONArray jsonArray = (JSONArray) object; -
int length = jsonArray.size(); -
for ( inti 0;= i < length; i++) { -
JSONObject jsonObject = (JSONObject) jsonArray.get(i); -
handleJsonObject(jsonObject); -
jsonArray.set(i, jsonObject); -
} -
-
} -
} -
-
public static void my_encode_v2(List -
throws IOException { -
if (list null== || list.isEmpty()) { -
return; -
} -
for (Iterator -
.hasNext();) { -
Map map = iterator.next(); -
Set keys = map.keySet(); -
for (Iterator iterator2 = keys.iterator(); iterator2 -
.hasNext();) { -
String key = iterator2.next(); -
Object object = map.get(key); -
if (object null== || instanceofobject String -
|| object instanceof Number) { -
if (object null)== { -
object = ""; -
} -
String value = object.toString(); -
if (value.equals( "null")|| "undefined"))value.equals( { -
value = ""; -
} -
value = URLEncoder.encode(value, "utf-8"); -
value = value.replaceAll("\\+", "百分之20(直接写的话博客上看不到)");// 其实+号是URLEncoder.encode后把空格转成+了,在页面上解码的时候是把空格当作了,所以要把+替换成 -
-
map.put(key, value); -
} -
-
} -
} -
} -
-
public static void main(String[] throwsargs) IOException { -
-
String value = "http://www.w3school.com.cn/My first ;/" -
value = value.replaceAll("\\+", " " ); -
System.out.println(value); -
} -
-
@SuppressWarnings("unchecked") -
private static void handleJsonObject(JSONObject jsonObject) -
throws Exception { -
Set keys = jsonObject.keySet(); -
for (Iterator iterator = keys.iterator(); iterator.hasNext();) { -
String key = iterator.next(); -
String objectStr = jsonObject.get(key).toString(); -
if ((objectStr.startsWith( "{")&& "}")))objectStr.endsWith( { -
my_decode_v2(JSONObject.fromObject(objectStr)); -
} else if (objectStr.startsWith( "[")&& "]"))objectStr.endsWith( { -
JSONArray jay = JSONArray.fromObject(objectStr); -
my_decode_v2(jay); -
jsonObject.put(key, jay); -
} else { -
objectStr = URLDecoder.decode(objectStr, "utf-8"); -
if (objectStr.equals( "null")|| "undefined"))objectStr.equals( { -
objectStr = ""; -
} -
jsonObject.put(key, objectStr); -
} -
} -
} -
}
就这样搞定了。有错误的话,还希望各位同行指出来,一起学习进步。
转自我自己的csdn:http://blog.csdn.net/c466254931/article/details/50857930