问题
在调用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" } }
|
分析
为解决这个问题:
- 将URL参数数据解码
- 解析数据, 需注意& = [] 字符
代码如下:
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
|
public static JSONObject convertURLParamToJsonFormat(String originalString) { JSONObject convertedJsonObject = new JSONObject(); try { String[] stringArray = URLDecoder.decode(originalString, "utf-8").split("&"); for (String s : stringArray) { String[] keyAndValue = s.split("="); if (!keyAndValue[0].contains("[") && !keyAndValue[0].contains("]")) { convertedJsonObject.put(keyAndValue[0], keyAndValue[1]); } else { String subKey = getSubUtilSimple(keyAndValue[0], "\\[(.*)\\]", 1); String key = getSubUtilSimple(keyAndValue[0], "(.*)\\[", 1); if (convertedJsonObject.get(key) == null) { JSONObject subJsonObject = new JSONObject(); subJsonObject.put(subKey, keyAndValue[1]); convertedJsonObject.put(key, subJsonObject); } else { 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中还有子对象, 就有问题. 同时, 如果有数组, 也没法解析. 只能说有局限性, 只能解决一部分问题.