首页 > 编程语言 >【c++基础】从json文件提取数据

【c++基础】从json文件提取数据

时间:2022-10-05 20:05:42浏览次数:104  
标签:std 提取 cout read c++ json JsonCpp include

前言

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

JsonCpp简介

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

JsonCpp使用

1.安装JsonCpp开源库;

$ sudo apt-get install

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​​;

标签:std,提取,cout,read,c++,json,JsonCpp,include
From: https://blog.51cto.com/u_15711436/5732824

相关文章

  • java如何将字符串转换为json格式字符串呢?
    转自:http://www.java265.com/JavaJingYan/202206/16540828373607.htmlJSON简介:   JSON(JavaScriptObjectNotation,JS对象简谱)是一种轻量级的数据交换格式。它基......
  • C++的基本数据类型
    C++的基本数据类型C++的数据类型可分为:1. 布尔类型:false0 true 12. 字符类型:可分为三种,char、signedchar、unsignedchar,其表现形式只是分为有符号和无符号,字符......
  • EffectiveC++中文版(第三版) pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1I1w2alIPQH1GJ32lz0MoaA点击这里获取提取码 ......
  • Effective Modern C++ 中文版 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1dYKjNiAsC3zrTrT1SO8g5g点击这里获取提取码 ......
  • C++之libcurl环境配置安装
    目录C++之libcurl环境配置安装前言curl与libcurl的区别InstalllibcurlonLinuxInstalllibcurlonWindows源码例子其他的网络库C++之libcurl环境配置安装前言最近在......
  • 一文了解JSON
    目录JSON在JavaScript中的使用。json的定义json的访问json的两个常用方法JSON在在java中的使用javaBean和和json的互转List和和json的互转map和和json......
  • C++基础神仙速度入门
    ​C++的各部分的重要程度我会标号10星为满分目录C++的基本知识只有个人认为主要的(重要程度:2星):C++的基本框架(重要程度:10星,必背)C++的基本语法(重要程度:9星): C++的基......
  • SAP UI5 应用元数据文件 manifest.json 的加载和解析原理讲解试读版
    一套适合SAPUI5初学者循序渐进的学习教程本专栏计划的文章数在​​300​​​篇左右,到​​2022年9月22日​​​为止,目前已经更新了​​133​​​篇,专栏完成度为​​......
  • Google Earth Engine(GEE)——利用sentinel-2数据进行农作物提取分析
    我们利用哨兵数据给农作物进行分类提取,主要有用到得时间节点是春夏秋冬四个季节,通过阈值法和updateMask来实现对农作物得提取。最近发现了一个巨牛的人工智能学习网站,点击跳......
  • C++自学笔记 多态性的实现 How virtual work in C++
     静态联编所支持的多态性称为编译时的多态性。当调用重载函数时,编译器可以根据调用时所使用的实参在编译时就确定下应调用哪个函数。动态联编所支持的多态性称为运行时......