zoukankan      html  css  js  c++  java
  • 【c++基础】从json文件提取数据

    前言

    标注数据导出文件是json格式的,也就是python的dict格式,需要读取标注结果,可以使用c++或者python,本文使用c++实现的。

    JsonCpp简介

    JsonCpp是一种轻量级的数据交换格式,是个跨平台的开源库,可以从githubsourceforge上下载源码。查找资料的过程中发现另一个开源库RapidJson,有时间可以了解一下。

    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 << "
    ";
    
            }
            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;

  • 相关阅读:
    flutter sdk版本升级或者降级到指定版本
    flutter upgrage到1.17版本 android打包报错 Could not determine the dependencies of task ':app:lintVitalRelease'.
    小程序 自定义alert弹窗 带动画
    小程序 自定义cell 自定义group
    小程序 自定义弹窗禁止底部内容滚动 textarea内容上移
    css fixed 强制居中
    小程序 正则表达式
    小程序 自定义导航栏
    小程序 swiper自定义dot
    java 中锁的分类
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/9921094.html
Copyright © 2011-2022 走看看