2017-05-03 519 views
0

我正在使用json-c庫。我在嘗試解析C中的json文件時遇到了兩個問題。使用json-c解析json文件

如果我嘗試解析文件,那麼我會在json_object_object_foreach()處發生分段錯誤。

但是,如果我刪除了json文件開始和結束的方括號,它只能解析第一個對象。我想解析整個json文件。

這裏是我的代碼:

int ParseJson(const char *file)                                        
{                    
      char *json;                 
      int fd;                  
      struct json_object *obj;              
      struct stat st;                

      fd = open(file, O_RDONLY);             
      json = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);    
      close(fd);                 

      obj = json_tokener_parse(json);            

      json_object_object_foreach(obj, key, val) {         
       printf("key = %s value = %s\n",key, json_object_get_string(val));  
      }                   

      return 0;                  
} 

這裏是我的JSON文件:

[{ 
     "test_1": "min", 
     "test_2": "max", 
     "test_3": "val", 
     "test_4": "res", 
     "test_5": "var", 
     "test_6": "hal" 
    }, { 
     "fetch_1": 300.00, 
     "fetch_2": 100.000, 
     "fetch_3": 0.000000, 
     "fetch_4": 0.000000, 
     "fetch_5": 20.00 
    }, { 
     "fetch_1": 250.00, 
     "fetch_2": 310.000, 
     "fetch_3": 3.000000, 
     "fetch_4": 7.000000, 
     "fetch_5": 18.00 
    }, { 
     "fetch_1": 450.00, 
     "fetch_2": 678.000, 
     "fetch_3": 3.000000, 
     "fetch_4": 3.000000, 
     "fetch_5": 89.00 
    }, { 
     "fetch_1": 300.00, 
     "fetch_2": 100.000, 
     "fetch_3": 7.000000, 
     "fetch_4": 67.000000, 
     "fetch_5": 50.00 
    }, { 
     "fetch_1": 900.00, 
     "fetch_2": 800.000, 
     "fetch_3": 6.000000, 
     "fetch_4": 5.000000, 
     "fetch_5": 30.00 
}] 
+2

'json_type_array'是否支持'key'和'val'的'json_object_object_foreach'? ......我想不會。也許檢查'json_object_is_type'並考慮'json_object_array_length'和'json_object_get_array'函數。 [閱讀文檔](http://json-c.github.io/json-c/json-c-0.12.1/doc/html/index.html),我可能是錯的。 – Myst

回答

3

這是一個有點滑稽,你問JSON-C,這是我剛撿到的時候爲我自己不久之前的目的。無論如何,這個問題當然是@Myst在評論中描述的。

我能夠複製你描述的問題,並且在調試器下運行該程序立即顯示segfault發生在迭代過程中,而不是解析。

仔細看看代碼,然後,根據程序包的命名約定,函數(宏,實際上)json_object_object_foreach()被指定用於代表JSON對象而不是JSON數組的對象。這就是名稱中第二個「對象」的意義。您不能將該宏應用於表示JSON數組的對象,因爲您在輸入中的頂級JSON結構是數組時嘗試執行此操作。因此,在確定如何檢查它之前,您必須測試您擁有哪種類型的對象。

您可以通過json_object_get_type()json_object_is_type()來確定您擁有的物品的類型。對於頂層數組,您可以通過json_object_array_length()獲取數組長度,並使用普通for循環遍歷索引範圍,通過json_object_array_get_idx()檢索元素。我目前沒有看到更好的選擇,但也許有人對圖書館更有經驗的人可以提供。