JAVA自已設計JSON解析器

固然,有不少很好的JSON解析的JAR包,好比JSONOBJECT,GSON,甚至也有爲咱們測試人員而打造的JSONPATH,但我仍是自已實現了一下(以前也實現過,如今屬於重構)。git

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

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

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>();對象

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

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上進行,不會同步至博客園,因此,須要最新代碼的,請點擊上面的連接!

有興趣的能夠看看,若是有任何問題,均可以聯繫我!

相關文章
相關標籤/搜索