2012-10-05 83 views
3

我在C中看到了許多用於解析JSON的庫,但它們都不能直接從文件流中讀取和解析。所有這些庫如Yajl,cjson的問題是,如果文件中的json文件很大,那麼您必須首先將所有這些讀入內存緩衝區,然後運行這些庫提供的API來解析它。C庫直接從文件流中讀取和解析JSON

有API的經常看起來像

cJSON *cJSON_Parse(const char *value) 

這需要一個char *的緩衝區。

我想避免這種情況,因爲我的文件可能非常大,我不能提前知道文件的大小。而且,這些庫保持對實際緩衝區中的對象,數組的檢索,以便我不能釋放原始緩衝區。

有沒有可以直接從文件流中讀取和解析的JSON解析庫?

+0

看看這些,如果你還沒有:[jsonsl](https://github.com/mnunberg/jsonsl),[Jansson](http://www.digip。 org/jansson /),[cson](http://fossil.wanderinghorse.net/repos/cson/index.cgi/index),[json-c](https://github.com/json-c/json -c),[json-parser](https://github.com/udp/json-parser),[jsmn](http ://zserge.bitbucket.org/jsmn.html)。我沒有看過他們的代碼。 –

回答

0

映射文件使用MMAP(過程),然後簡單地使用返回的地址進行的char *操作,使所有的人有用,一個很好的方法來解決問題

+0

所有系統都有'mmap()'嗎?這個問題似乎沒有指定一個特定的操作系統。 – hippietrail

3

http://lloyd.github.com/yajl/可能是你在找什麼

+0

尚未測試,但因爲它看起來非常適用,所以還未進行測試。 – unwind

+0

我在我的評論中提到了這一點。如果你看看它的API,它在char *上運行內存中的緩衝區。不在文件上 – auny

+0

如果您使用XML的SAX解析器的JSON等價物,那麼yajl就是您所追求的。請參閱您將實現的回調函數:http://lloyd.github.com/yajl/yajl-2.0.1/structyajl__callbacks.html –