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

假如你有一段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=9a4fMaQSgnD3kSNW0W8qKe4UqdLktZJC9AzJCdV1WJ4%2BoJq682zgd%2FYcu%2BJYndnDmUgq&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=9a4fMaQSgnD3kSNW0W8qKe4UqdLktZJC9AzJCdV1WJ4%2BoJq682zgd%2FYcu%2BJYndnDmUgq&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 object) throws Exception {
		if (object instanceof JSONObject) {// 是对象
			JSONObject jsonObject = (JSONObject) object;
			handleJsonObject(jsonObject);
		} else if (object instanceof JSONArray) {// 是对象
			JSONArray jsonArray = (JSONArray) object;
			int length = jsonArray.size();
			for (int i = 0; i < length; i++) {
				JSONObject jsonObject = (JSONObject) jsonArray.get(i);
				handleJsonObject(jsonObject);
				jsonArray.set(i, jsonObject);
			}

		}
	}

	public static void my_encode_v2(List<Map<String, Object>> list)
			throws IOException {
		if (list == null || list.isEmpty()) {
			return;
		}
		for (Iterator<Map<String, Object>> iterator = list.iterator(); iterator
				.hasNext();) {
			Map<String, Object> map = iterator.next();
			Set<String> keys = map.keySet();
			for (Iterator<String> iterator2 = keys.iterator(); iterator2
					.hasNext();) {
				String key = iterator2.next();
				Object object = map.get(key);
				if (object == null || object instanceof String
						|| object instanceof Number) {
					if (object == null) {
						object = "";
					}
					String value = object.toString();
					if (value.equals("null") || value.equals("undefined")) {
						value = "";
					}
					value = URLEncoder.encode(value, "utf-8");
					value = value.replaceAll("\\+", "百分之20(直接写的话博客上看不到)");// 其实+号是URLEncoder.encode后把空格转成+了,在页面上解码的时候是把空格当作了,所以要把+替换成

					map.put(key, value);
				}

			}
		}
	}

	public static void main(String[] args) throws 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<String> keys = jsonObject.keySet();
		for (Iterator<String> 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") || objectStr.equals("undefined")) {
					objectStr = "";
				}
				jsonObject.put(key, objectStr);
			}
		}
	}
}

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






  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中获取请求体的JSON解析JSON对象时出现了参数含有空格和乱码的问题。出现这个问题可能是由于请求体JSON中的参数值中含有空格或者非UTF-8编码导致的。 要解决这个问题,首先需要检查并确认请求体JSON中的参数值是否正确且符合JSON格式的规范。如果参数值含有空格或其他特殊字符,建议在发送请求时对参数值进行URL编码,确保其在传输过程中不出现乱码。 在Java代码中,可以使用URLDecoder对请求体JSON进行解码。例如,可以使用如下代码获取请求体中的JSON字符串,并进行解码: String body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator())); String decodedBody = URLDecoder.decode(body, "UTF-8"); 接下来,可以使用JSON库(如Jackson、Gson等)将解码后的JSON字符串解析JSON对象。例如,对于使用Jackson库的情况,可以使用如下代码将解码后的JSON字符串解析JSON对象: ObjectMapper mapper = new ObjectMapper(); JsonNode jsonNode = mapper.readTree(decodedBody); 在解析JSON对象之后,可以通过遍历JSON对象的属性、调用对应的getter方法等获取具体的参数值,进行后续的业务逻辑处理。 综上所述,要解决Java获取请求体JSON解析JSON对象参数含有空格乱码的问题,需要注意参数值的格式以及编码方式,并在Java代码中正确解码和解析JSON对象。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值