天天看點

用原始方法解析複雜字元串,json一定要用JsonMapper麼?1.不規則非json字元串2.鍵值對字元串分割函數3.複雜Json格式的字元串4.标準的json格式5.總結

    經常采集資料,肯定會碰到解析字元串,包括整個頁面的html,或者json以及一些不标準的json格式。。。

    以前用json序列化,有時候需要實體類,有的時候沒有,比較麻煩,聽說可以用jsonmapper,解析為字典格式。不過沒用過,習慣了用最原始的方法來解析字元串,是以這裡分享幾個解析的案例。也許會有點作用。

    解析字元串最常用的應該是splite和replace了。分割,然後替換一些引号之類的。最後組合。特别是采集的時候,經常會把html頁面中某一段要提取出來,可能很多人用正規表達式,可是不會啊,也不願意去學。那隻好用這些原始的方法了,時間久了,也積累一些經驗或者函數。看看幾個例子。

    先看看這個例子,字元串是連在一起,沒有換行的,為了友善觀察,換行了,程式是原始在一起的:

    先來分析一下這個字元串的特點,才能找到思路哦:

1.每一組資料都是在[]括号對中,每一組資料用,号分割,是以最終要形成一個數組來通路哦。

2.每一組的資料基本都是用 , 号分割,字元串類型還有單引号 ;

3.第7個數組是一個整體,也使用,号分割,整體是字元串有引号;

4.第2組資料有空值,直接用,号分割,是以splite的時候不能去掉空值,否則數組長度不一樣,定位就亂了。

    既然分析都完了,那思路呢?

1.組直接分割使用  ], 标記,然後每一組要repalce掉 [  和 ] 。主要是最前和最後;

2.組内分割,使用  ,号标記分割,出來之前要把單引号給 替換掉 ;不然也是作為字元串,引号也包括進去了;

3.至于那個 數組 的處理,不能過于想複雜,分割之後,直接在最後增加1個元素,将固定位置7-12的組合起來;這樣也許友善點;

4.由于空值有占位,是以每一組的長度是固定的。是以處理的時候直接根據自己想要的位置來組合。

    下面看看代碼了,c#版本,相對與一行代碼,仔細看,linq很是一個神器,真的是神奇。。。說多了都是淚,為啥就沒早點學呢:

看看結果怎麼樣:

用原始方法解析複雜字元串,json一定要用JsonMapper麼?1.不規則非json字元串2.鍵值對字元串分割函數3.複雜Json格式的字元串4.标準的json格式5.總結

  上面預設的鍵值對分割符号為 = 号,根據實際情況進行修改,json格式裡面一般是:冒号比較多。

    上面的例子比較簡單,這次看一個稍微複雜點的,雖然可能用jsonmapper可以很輕易做到,但試一下最原始的方法吧。還是按照上面的思路,先分析字元串的特點:字元串是連在一起,沒有換行的,為了友善觀察,換行了,程式是原始在一起的:

還是先分析特點,這個格式應該是json類似的了,比較規則:

組與之間是使用 , 号分割;前後有{}括号對;觀察前後可以使用 ], 字元串将組分開;

鍵 是整數,鍵值是通過 : 号分割;

值是一個數組,有5個元素,通過 , 号分割

都有單引号,需要過濾掉;其他沒有特殊情況;

代碼解決過程:

看看結果如何:

用原始方法解析複雜字元串,json一定要用JsonMapper麼?1.不規則非json字元串2.鍵值對字元串分割函數3.複雜Json格式的字元串4.标準的json格式5.總結

    在實際的采集過,可能會碰到直接url,傳回的就是json格式,比較标準。這裡舉個例子,如下面這個頁面連結:

<a href="http://d.dacai.com/zhishu/correctcorp.html?matchid=1899040&amp;matchstatusid=41">http://d.dacai.com/zhishu/correctcorp.html?matchid=1899040&amp;matchstatusid=41</a>

點選開後,是這個樣子:

用原始方法解析複雜字元串,json一定要用JsonMapper麼?1.不規則非json字元串2.鍵值對字元串分割函數3.複雜Json格式的字元串4.标準的json格式5.總結

這個應該夠複雜了,我們分析一下,篇幅較大,源碼對照連結:

每一大組資料,是用,号分割;整體也是前後大括号對{},有4個大類,鍵分布是:indbodans,indevengoals,indgoalss,indhalffulls。

每一組的子類中,包括的都是同一個類型的資料,每一個子資料組都有n多個小的鍵值對,如matchid,corpid等等,使用},可以分割

分析完成之後如何解決,思路是類似的,先整體分割,使用},進行,然後每一個之類作為鍵,對值再次進行分割。。。形成字典清單。其中的引号也是需要過濾的,至于數值類型,實際用到那個的時候,都是根據key去找,再進行convert轉換就可以了。看看源代碼:

看看解析的結果如何:

用原始方法解析複雜字元串,json一定要用JsonMapper麼?1.不規則非json字元串2.鍵值對字元串分割函數3.複雜Json格式的字元串4.标準的json格式5.總結

注意,有元素是空值的,可以不用管。至于那幾個鍵值對數組,最終屬于哪一個大類?雖然沒有直接标記出來,但是這個問題随便加一個判斷就可以了,因為每一個類别的鍵名稱是不一樣的,看看是否包括對應的鍵就可以确定類别。

    雖然過程很簡單,也許有更簡單的辦好,直接和實體類映射,json反序列化更友善,但有時候沒有實體類,也挺麻煩。特别是這種變态複雜的,jsonmap直接處理不知道行不行。總之本文的目的是盡可能使用簡單原始的方法來解決問題,也是一個思路。雖然有時候我很懶,喜歡用開源元件,但有的時候一旦用上原始的了,也不喜歡改了。

    字元串分析處理的過程雖然繁瑣,但基本都是比較簡單的,細緻一點,都不是事。

  最後把這個測試的源代碼發上來,大家别忘了點贊哦。。。