问题

在调用jQuery.load方法时, 需要将数据Post到controller中, 问题是获取的数据是URL参数形式, 而非是JSON格式, 也没找到现成的解析方法. 当前问题只针对如何将URL参数数据转JSON. 一般是遇不到这种情况, $.ajax$.post都支持Post JSON数据, 但是业务场景中必须要用到load方法, 于是遇到了这个问题.

原数据:

1
"a=avalue&b=bvalue&object%5Bkey1%5D=value1&object%5Bkey2%5D=value2"

目标数据

1
2
3
4
5
6
7
8
{
"a":"avalue",
"b":"bvalue",
"object":{
"key1":"value1",
"key2":"value2"
}
}

分析

为解决这个问题:

  1. 将URL参数数据解码
  2. 解析数据, 需注意& = [] 字符

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
* 将URL参数数据解析成Json数据
*
* @param originalString: 原始数据
* @return 解析成JSON数据
*/
public static JSONObject convertURLParamToJsonFormat(String originalString) {
JSONObject convertedJsonObject = new JSONObject();
try {
// 解码原始数据,以&分割成字符串数组
String[] stringArray = URLDecoder.decode(originalString, "utf-8").split("&");
for (String s : stringArray) {
// 以=分割成key和value
String[] keyAndValue = s.split("=");
// 有[和]是对象,需要特殊处理
if (!keyAndValue[0].contains("[") && !keyAndValue[0].contains("]")) {
// 直接存入为键值对
convertedJsonObject.put(keyAndValue[0], keyAndValue[1]);
} else {
// 解析为子JSON对象,拿到子对象中的key值
String subKey = getSubUtilSimple(keyAndValue[0], "\\[(.*)\\]", 1);
// 拿到key值
String key = getSubUtilSimple(keyAndValue[0], "(.*)\\[", 1);
// 无该key值, 则新建JSON对象
if (convertedJsonObject.get(key) == null) {
JSONObject subJsonObject = new JSONObject();
subJsonObject.put(subKey, keyAndValue[1]);
convertedJsonObject.put(key, subJsonObject);
} else {
// 有key值,则取JSON对象
JSONObject subJsonObject = (JSONObject) convertedJsonObject.get(key);
subJsonObject.put(subKey, keyAndValue[1]);
convertedJsonObject.put(key, subJsonObject);
}
}
}
} catch (UnsupportedEncodingException e) {
// 处理异常
}
// 拼装完成,返回结果
return convertedJsonObject;
}

public static String getSubUtilSimple(String soap, String rgex, int index) {
Pattern pattern = Pattern.compile(rgex);// 匹配的模式
Matcher m = pattern.matcher(soap);
while (m.find()) {
return m.group(index);
}
return "";
}

总结

这个算法只能解决当前业务场景, 在object中还有子对象, 就有问题. 同时, 如果有数组, 也没法解析. 只能说有局限性, 只能解决一部分问题.