1. 程式人生 > >【c++基礎】從json檔案提取資料

【c++基礎】從json檔案提取資料

前言

標註資料匯出檔案是json格式的,也就是python的dict格式,需要讀取標註結果,可以使用c++或者python,本文使用c++實現的。

JsonCpp簡介

JsonCpp是一種輕量級的資料交換格式,是個跨平臺的開源庫,可以從githubsourceforge上下載原始碼。

JsonCpp使用

1.安裝JsonCpp開源庫;

$ sudo apt-get install libjsoncpp-dev

2.根據json檔案編輯測試程式讀取json資料;

/read_json$ ls
eye_state_20181102_20181106_095415.json  read_json.
cpp

3.編譯除錯測試程式;

/read_json$ g++ -o read_json read_json.cpp -ljsoncpp
/read_json$ ./read_json 

測試程式

/*
* AMY
* read_json.cpp
* Date: 20181106
*/
#include <iostream>
#include <fstream>
#include <jsoncpp/json/json.h>

int main() 
{
    Json::Reader reader;
    Json::Value root;
    std::ifstream ifs;
    ifs.open(
"eye_state_20181102_20181106_095415.json", std::ios::binary); std::string line; while(std::getline(ifs, line)) { if(!reader.parse(line, root)) return -1; std::string url_image = root["url_image"].asString(); std::cout << "root.size(): " << root.size() << std::endl; std::size_t pos
= url_image.find("/zrj_close"); std::string image_name = url_image.substr(pos); std::cout << "image_name: " << image_name << std::endl; std::cout << "data: " << std::endl; for(int i=0; i<root["result"].size(); i++) { Json::Value data = root["result"][i]["data"]; std::cout << "val: " << std::endl; for(int j=0; j<data.size(); j++) { int val = data[j].asInt(); std::cout << val << "---" ; } std::cout << "\n"; } line.clear(); } ifs.close(); return 0; }
View Code

問題

1.

fatal error: json/json.h: No such file or directory
compilation terminated.

原因:沒有正確安裝JsonCpp開源庫,或者標頭檔案的路徑不匹配。

2.

[100%] Linking CXX executable read_json
CMakeFiles/read_json.dir/read_json.cpp.o: In function `main':
read_json.cpp:(.text.startup+0x2a): undefined reference to `Json::Reader::Reader()'
read_json.cpp:(.text.startup+0x34): undefined reference to `Json::Value::Value(Json::ValueType)'

參照here的方法實現的,將原始碼中的json和lib_json資料夾置於同一目錄,使用Cmake編譯過程中出現錯誤,即使添加了JsonCpp的include路徑和‘-ljsoncpp’,這個問題暫時還沒有解決,改用其他方法(g++直接編譯)完成。

CMakeLists.txt

#1.cmake verson,指定cmake版本 
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_COMPILER "g++")
list(APPEND CMAKE_CXX_FLAGS "-O3 -DNDEBUG -ffast-math -Wall -pthread -fopenmp -std=c++11 -ljsoncpp")
#2.project name,指定專案的名稱,一般和專案的資料夾名稱對應
project(read_json)
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)

#3.head file path,標頭檔案目錄
INCLUDE_DIRECTORIES(include; /lib/opencv2413/opencv-2.4.13.4/build/include; /usr/include)
#aux_source_directory("src/include" SOURCES_FILE)

#4.source directory,原始檔目錄
AUX_SOURCE_DIRECTORY(src DIR_SRCS)

#5.set environment variable,設定環境變數,編譯用到的原始檔全部都要放到這裡,否則編譯能夠通過,但是執行的時候會出現各種問題,比如"symbol lookup error xxxxx , undefined symbol"
#SET(TEST_MATH${DIR_SRCS})
SET(OpenCV_DIR /lib/opencv2413/opencv-2.4.13.4/build) 
FIND_PACKAGE(OpenCV REQUIRED) 
#6.add executable file,新增要編譯的可執行檔案
#ADD_EXECUTABLE(${PROJECT_NAME} ${DIR_SRCS})

#7.add link library,新增可執行檔案所需要的庫,比如我們用到了libm.so(命名規則:lib+name+.so),就新增該庫的名稱
ADD_EXECUTABLE(read_json read_json.cpp)
TARGET_LINK_LIBRARIES(read_json ${OpenCV_LIBS})
View Code

使用Cmake的方法編譯除錯有問題,以後有時間遇到再解決。

3.注意json檔案每條資料的層級關係,以及如何層層獲取資料資訊。

4.如果對JsonCpp庫的某個函式呼叫有疑問可以檢視原始碼學習。

參考

1.從檔案提取json資料

2.How to install and use Jsoncpp library on Ubuntu

3.Jsoncpp詳解

4.通過Jsoncpp類庫讀寫JSON檔案

5.JSON檔案的讀取和生成

6.open-source-parsers-jsoncpp-github;