JAVA自已設計JSON解析器


當然,有很多很好的JSON解析的JAR包,比如JSONOBJECT,GSON,甚至也有為我們測試人員而打造的JSONPATH,但我還是自已實現了一下(之前也實現過,現在屬於重構)。

思想是這樣的,以這個JSON串為例:String j = "{\"a\":\"b\",\"c\\\"b\":{\"a\":1},\"d\":[\"a\",{\"a\":3},{\"a\":2},\"\"],\"e\":\"b\"}";

我們在保證只掃描一次字符串的情況下,就把JSON串解析成功。於是,我先定義了一個List: private List<Object> collections = new ArrayList<Object>();

collections用來存放這個JSON串中所有的LIST與MAP,在掃描時,一旦碰到{或[,就new一個Map或List,然后add到collections中去了:

存放進去后,我們需要一個map來記錄collections里的list或map的狀態,比如是否已經閉合了,是一個list還是一個map,在collections中的index:private Map<String, Map<String, Integer>> index = new HashMap<String, Map<String, Integer>>();

可以看到,這個MAP的key是由1 1.1 1.2 1.1.1這樣來組成的,所以,這個key就可以用來表示json的層級結構了,當然我還用了一個list來保存這些key的順序:private List<String> level = new ArrayList<String>();

這樣一來,數據結構就很清晰了。接下來要做的事,就是在掃描中的一些判斷了,保持以下幾個點:

1.碰到[或{就new一個對象,並將對象存放到collections中去

2.碰到'\\'需要轉義的,得直接跳過去,並存放到掃描出來的臨時變量中去。比如\\{就不需要new一個對象

3.碰到"符號,就要打個標記,在下一個"出現之前,把掃描出來的都當成一個字符串放到臨時變量中去。

4.碰到:符號,就要開始標記是個map的開始了,並把之后出現的字符串都存放到另一個臨時變量中去。

5.碰到,符號,就要開始處理臨時變量了,如果是map就把之前存的兩個昨時變量,一個作為KEY,一個作為VALUE,都放到collections中對應的map中去,如果是list,則把之前存的第一個臨時變量,放到collections對應的list中去。

6.碰到]或}符號,則表示一個list或map被解析完全了,則這時候要去更新index中的對應的list或map的狀態了。

解析完了后,所有的數據都在collections index level這三個變量中了,於是,我們只需要定一個取數據的規則就行了,我用的是一種類似於xpath的語法格式來取值的,這時候只需要解析下這個xpath路徑就可以得出這個key,然后在collections中拿值就可以了!

以下是代碼下載地址:

http://files.cnblogs.com/files/zhangfei/zson.rar

貼一下使用方法:

 備注:上面的例子中,我們可以看到,XPATH只支持絕對路徑(代碼都有,大家可以擴展成相對路徑),用*[]來表示一個list,用map的key來找其value!

GITHUB地址:https://github.com/zhangfei19841004/zson

最新的更新及說明,都會在github上進行,不會同步至博客園,所以,需要最新代碼的,請點擊上面的鏈接!

有興趣的可以看看,如果有任何問題,都可以聯系我!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM