2017-10-06 92 views
0

我想使用RapidJson解析C++中的json數據。我不知道我在哪裏做錯了,但我的斷言失敗了。當我嘗試調試它顯示sigabrt時,它運行線斷言。社區我感謝你的見解。感謝您回答這個天真的問題。斷言快速失敗

#include <iostream> 
#include <assert.h> 
#include "hpdf.h" 
#include "rapidjson/document.h" 
#include "rapidjson/writer.h" 
#include <rapidjson/istreamwrapper.h> 
#include <fstream> 

int main() { 

    std::ifstream ifs("/home/is/..../test.json"); 
    rapidjson::IStreamWrapper isw(ifs); 

    rapidjson::Document document; 
    document.ParseStream(isw); 


    assert(document.IsObject()); 

    rapidjson::Value::MemberIterator hello = document.FindMember("timeStamp"); 
    std::string vali = document["timestamp"].GetString(); 
    std::cout << vali << std::endl; 

    return 0; 

} 

我嘗試過使用rapidJson文件流,但它又失敗了在同一行。

[ 
    { 
    "timeStamp": "...", 
    "alertType": "...", 
    "instanceId": 8 

    } 
    ] 
+0

使用[GCC](http://gcc.gnu.org/)編譯所有警告和調試信息:'g ++ -Wall -Wextra -g'。 **使用調試器**'gdb'。使用[jq](https://stedolan.github.io/jq/)檢查JSON輸入的有效性。將輸入文件路徑作爲程序參數傳遞給'main' –

+0

仔細閱讀[RapidJson教程](http://rapidjson.org/md_doc_tutorial.html),然後深入參考文檔 –

+1

這裏提供了很多錯誤檢查的機會。也許文件甚至沒有打開。 –

回答

0

瞭解更多關於JSON

您的輸入文檔(以[開頭)是包含單個JSON對象的JSON數組。

我建議使用document.GetType(),然後對其結果進行不同的處理(可能使用switch)。

因此document.IsObject()爲假是正常的。對於你的輸入document.IsArray()應該是真實的,你的JSON對象可以通過document[0]

+0

rapidjson中的JsonObject將數組也視爲JsonObject – Bijju

+1

那麼IsArray()和IsObject()之間的區別是什麼? –

1

99%因爲你的JSON是錯誤的。

然而,"timeStamp"是不一樣的"timestamp"

+0

是的,JSON數據中的時間戳是timeStamp。問題是它甚至沒有達到那一點。它在該行之前停止。 – Bijju

0

你可以訪問該數組中的JSON對象我認爲我已經解決了這個問題。你們從開始就是對的。我的data.json存在問題。當.json文件中沒有[]時,此庫工作。我刪除了方括號,似乎一切正常。感謝您的時間和見解。我非常感謝你的回覆。

+0

這不是一個答案 –