web-URL参数解析

需求:  对URL进行去重,去掉所有的参数中value内容,只保留path和key

解决方案:

1. 首先根据 分号字符(?) 分割出path和param

2. 然后在对param进行解析,使用&进行分割,获得每个itema

3. 最后对itema使用=进行分割,保留key

4. 最后拼接path和key获得唯一字符串 ,为一个url的唯一标志

但后来发现一些不符合预期的结果,比如使用jsonp的调用,参数中是存在任意字符的。形如:a={"c":[{"d":"8&6"}]}&b=2 ,导致解析失败

最后发现只能通过逐字符解析,才能解决这个问题。

具体实现:

1. 进行URL解码,若解码失败,对关键字符 %7B -> {, %7D -> }, %20 -> 空

2. 初始化iFlag=0, key =‘‘, val= ‘‘, strSplit= ‘/‘ #key之间分隔符,strKey = ‘‘ #记录所有key的结果

3. 获得一个字符 item,下标 i

4. if iFlag > 0:

if iFlag == 1:  value 起始位置

iStartDakuohao = i

if iFlag == 1 && item == ‘ ‘: #跳过空格

continue

if iFlag == 1&& item == ‘{‘:

iFlag = 2

iCountDakuohao = 1

iStarDakuohao = i  //重新定义jsonp的开始位置

continue

if iCountDakuohao > 0:

if item == ‘}‘:

iCountDakuohao --

if iCountDakuohao == 0:

strTmp = jsondata

list jsondata

else if item == ‘{‘:

iCountDakuohao ++

else if item == ‘&‘  #普通形式的value结尾

iFlag = 0

else

val.add(item)

else if key.len == 0 && item == ‘‘ continue #过滤掉 开始的空白符 比如 a=1& b=2

if item == ‘=‘ { iFlag =1; #表示已经获得key

if key != ‘_‘:

strKey = strKey + key + strSplit

key = ‘‘

}

else {

if item == ‘&‘:  #过滤掉没有值得key 比如 a&b=1

key = ‘‘

else:

key.add(item)  #key里面增加一个字符

}

样例代码:

private static String getAllKeyList(String str,String strSplit) throws UnsupportedEncodingException {
        String  strKey = "";
        StringBuffer key = new StringBuffer();
        StringBuffer val = new StringBuffer();
        int  iFlag = 0;
        int iCountDakuohao = 0;
        int iStartDakuohao = 0;
         try {
            str = java.net.URLDecoder.decode(str, "utf-8");
        }catch (Exception exp){

            if(str.indexOf("%7B") > -1){
                str = str.replace("%7B", "{");//
            }
            if(str.indexOf("%7D") > -1){
                str = str.replace("%7D", "}");
            }
            if(str.indexOf("%20") > -1){
                str = str.replace("%20"," ");
            }
        }

        for (int i = 0; i < str.length(); i++) {
            char  item =  str.charAt(i);
            if(iFlag > 0){
                //跳过= 与{之间空格, 兼容不是jsonp 保留value最开始位置
                if(iFlag == 1){   //value起始位置
                    iStartDakuohao = i;
                }
                if(iFlag == 1 && item == ‘ ‘){
                    continue;
                }
                if(item == ‘{‘ &&  iFlag == 1){
                    iFlag = 2;
                    iCountDakuohao = 1;
                    iStartDakuohao = i;  //jsonp开始位置 重新定义
                    continue;
                }
                if(iCountDakuohao > 0){
                    if(item == ‘}‘){
                        iCountDakuohao--;
                        if(iCountDakuohao == 0){
                            String strTmp = str.substring(iStartDakuohao, i+1);
                            try{
                                if(strTmp.indexOf("%22") > -1){
                                    strTmp = strTmp.replace("%22", "\"");
                                }
                                if(strTmp.indexOf("\\x5C") > -1){
                                    strTmp = strTmp.replace("\\x5C","\\");
                                }
                                if(strTmp.indexOf("\\x22") > -1){  //强制转换 \x22
                                    strTmp = strTmp.replace("\\x22", "\"");
                                }
                                JSONObject obj =  JSONObject.fromObject(strTmp);
                                Iterator iterator = obj.keys();
                                while (iterator.hasNext()){
                                    String t = (String) iterator.next();
                                    strKey = strKey + t + strSplit;
                                    //获得json中value
                                   // System.out.println(obj.get(t));
                                } // end while
                            }catch (Exception exp){
                                System.out.println(exp.getMessage());
                            }
                            // System.out.println(Integer.toString(iStartDakuohao) + "---" + strTmp + " --- " + Integer.toString(i));
                        }
                    }else if(item == ‘{‘){
                        iCountDakuohao++;
                    }
                    continue;
                }
                if(item == ‘&‘) {
                    // bFindKey = false;
                    iFlag = 0;
                    //获得value
                 //   System.out.println(str.substring(iStartDakuohao, i));
                }else
                    val.append(item);
            }else {
                // 过滤掉 a=1& m=2
                if(key.length() == 0 && item == ‘ ‘)
                    continue;
                if (item == ‘=‘) {
                    //  bFindKey = true;
                    iFlag = 1;
                    String strTmp = key.toString();
                    if(!strTmp.equals("_"))
                        strKey = strKey + strTmp + strSplit;
                    key.setLength(0);

                } else {
                    if(item == ‘&‘)  //过滤掉 没有值的key  比如 a&b=1
                        key.setLength(0);
                    else
                        key.append(item);
                }
            }
            if( i == str.length() -1){
                //输出最后一个value
              //  System.out.println(str.substring(iStartDakuohao, i+1));
            }
        }
        return strKey;
       // System.out.println(strKey);
    }

      String str = "param=  {\"a\":1}&d& m= 78&_=1234";

        System.out.println(getAllKeyList(str,"/"));

 
   

一个bug,只能解析一级json,不能进行多级json提取

时间: 2024-10-20 04:50:21

web-URL参数解析的相关文章

百度URL参数解析

百度URL参数解析 在用Python爬取百度搜索的内容时,发现百度搜索的url非常的长,往往会跟一大段的参数,但其实很多参数都是没有必要的,如同样是搜索java关键字,可以通过 http://www.baidu.com/s?wd=java 如此简单的URL来获取,而下面这个超级复杂的URL也是同样进行了关键字java的搜索: http://www.baidu.com/s?wd=java&rsv_spt=1&rsv_iqid=0xd3c8c51900052eb3&issp=1&

把URL参数解析成一个Json对象

问题:请编写一个JavaScript函数parseQueryString,它的用途是把URL参数解析为一个对象.           eg:var obj=parseQueryString(url); 创建对象的三种形式:        一:                var Person=new Object();                Person.name="Sun";                Person.age=24;        二:         

java 获取url及url参数解析

java  获取url及url参数解析 一.url编码:URLEncoder.encode(userName); 二.url解码: URLDecoder.decode(userName);

五种URL参数解析方法的性能比较

因为在最近项目中需要解析日志中的 URL 的参数,所以我对比了一下五种不同 的 URL 参数解析方法的性能.URL 参数解析方法: httpclient org.apache.http.client.utils.URLEncodedUtils URLEncodedUtils.parse(query, Charset.forName("UTF-8"));jettyUtil org.eclipse.jetty.util.UrlEncoded MultiMapvalues = new Mul

js js获取url及url参数解析

js获取url及url参数解析 一.获取url: var url=window.location.herf; 二.url参数解析: function GetRequest() { var url = location.search; //获取url中"?"符后的字串 var obj= new Object(); if (url.indexOf("?") != -1) { var str = url.substr(1); strs = str.split("

URL 参数解析

url参数解析为对象 url参数解析为数组 URLSearchParams(兼容性有待提高,慎用) url参数解析为对象 const urlQueryToObject = (url) => { if((/\?/).test(url)) { const arr = url.split('?')[1].split('&'); return arr.reduce((acc,value,index) => {value.replace(/(\w+)=(\w+)/,(match,p1,p2) =

封装一个方法:把URL参数解析为一个对象,来获取地址栏url里面的传递的参数。

URL参数解析 //获取url方法 //window.location.href // function getUrlkey(url){ var params = {}, arr = url.split("?"); if (arr.length <= 1) return params; arr = arr[1].split("&"); for(var i=0, l=arr.length; i<l; i++){ var a = arr[i].spl

URL参数解析方法

这几天遇到这样一个需求,需要在不同页面之前传递参数,一般我们都是通过URL来传递,如下 window.open('test.html?id=123&name=456') 然后在新窗口的时候我们再用window.location.search方法获取?后面的参数内容,但是拿到的内容是"?id=123&name=456"这样的形式,我们还需要进行一系列的字符串处理才能拿到我们需要的信息,这样就比较麻烦一些了,所以我们就基于这个需求封装一个工具方法来把参数后面的内容解析成一个

编写一个参数JavaScript函数parseQueryString,它的用途是把url参数解析为一个对象

var url = "http://www.taobao.com/index.php?key0=0&key1=1&key2=2............."; var obj = parseQueryString(url); function parseQueryString(argu){ var str = argu.split('?')[1]; var result = {}; var temp = str.split('&'); for(var i=0; i

js url参数解析获取

function get_url_parm_list(str){ var params=str.substr(str.indexOf('?')+1); var param_list=[]; while(params.indexOf('=')!=-1){ var ind=params.indexOf('='); var k=params.substr(0,ind); var sp=params.indexOf('&'); if(sp==-1){ var v=params.substr(ind+1)