jsoncpp使用说明

合集下载

Jsoncpp使用方法大全

Jsoncpp使用方法大全

Jsoncpp使⽤⽅法⼤全Jsoncpp 使⽤⽅法⼤全Json(JavaScript Object Notation )是⼀种轻量级的数据交换格式。

简⽽⾔之,Json组织形式就和python中的字典, C/C++中的map⼀样,是通过key-value对来组织的,key是任意⼀个唯⼀字符串,value可以是bool,int,string 或者嵌套的⼀个json。

关于Json 格式可以参考。

是⼀个⽤来处理 Json⽂本的开源C++库,下⾯就简单介绍使⽤Jsoncpp对Json⽂件的常见操作。

Jsoncpp 常⽤变量介绍在Jsoncpp中,有⼏个常⽤的变量特别重要,⾸先介绍⼀下。

Json::ValueJson::Value ⽤来表⽰Json中的任何⼀种value抽象数据类型,具体来说,Json中的value可以是⼀下数据类型:有符号整数 signed integer [range: Value::minInt - Value::maxInt]⽆符号整数 unsigned integer (range: 0 - Value::maxUInt)双精度浮点数 double字符串 UTF-8 string布尔型 boolean空 ‘null’⼀个Value的有序列表 an ordered list of Valuecollection of name/value pairs (javascript object)可以通过[]的⽅法来取值。

//Examples:Json::Value null_value; // nullJson::Value arr_value(Json::arrayValue); // []Json::Value obj_value(Json::objectValue); // {}Json::ReaderJson::Reader可以通过对Json源⽬标进⾏解析,得到⼀个解析好了的Json::Value,通常字符串或者⽂件输⼊流可以作为源⽬标。

C++使用jsoncpp解析json数据

C++使用jsoncpp解析json数据

C++使⽤jsoncpp解析json数据整合⾃⽹路⼀、安装的⽅法1、安装 scons 解压:tar -zvxf scons-2.1.0.tar.gz 进⼊到解压⽬录scons-2.1.0 执⾏命令: sudo python setup.py install2、安装 Jsoncpp 解压:tar -zvxf jsoncpp-src-0.5.0.tar.gz 进⼊到jsoncpp解压⽬录下,执⾏命令: sudo scons platform=linux-gcc 将/jsoncpp-src-0.5.0/include/⽬录下的json⽂件夹拷贝到 /usr/local/include/ 将jsoncpp-src-0.5.0/libs/linux-gcc-4.9.1/⽬录下的libjson_linux-gcc-4.9.1_libmt.a 拷贝到 /usr/local/lib/ 下,并为了⽅便使⽤,将其重命名为libjson.a⼆、使⽤⽅法1、使⽤ parse 接⼝进⾏转化Json::Reader *pJsonParser = new Json::Reader();string strJson = "1111 {}"; //不合法jsonJson::Value tempVal;if(!pJsonParser->parse(strJson, tempVal)){cout << "parse error" << endl;return -1;}string name = tempVal["name"].asString();2、数组解析Json::Reader *pJsonParser = new Json::Reader();string strJson = "{\"name\":\"tom\",\"sex\":\"男\",\"age\":\"24\",\"friends\":[{\"name\":\"chen\',\'sex\':\'男\"},{\"name\":\"li\",\"sex\":\"⼥\"}]}";Json::Value tempVal;if(!pJsonParser->parse(strJson, tempVal)){return -1;}Json::Value friends = tempVal["friends"];for(int i = 0;i < friends.size();i++){ cout << friends[i]["name"].asString() << endl;}3、先进⾏类型判断if(tempVal["name"].isInt()){int name = tempVal["name"].asInt();}。

JsonCpp操作数组对象

JsonCpp操作数组对象

JsonCpp操作数组对象JsonCpp操作数组对象概述Json格式数据中,除了简单的String类型和⼀些⾮String类型,也有像各种⾼级语⾔中的数组类型⼀般的数组对象,且Json数组在实际开发中使⽤频率也⽐较⾼,这⾥就记录⼀些对于Json数组的常规操作。

JsonCpp操作简单数组对象Json数组对象以”[]”进⾏包裹,⽅括号内的元素即是数组的元素。

数组的元素可以是⼀些基本的Json类型,也可以是⼀些复杂的Json对象,刚开始就说⼀下对于元素为基本Json类型的数组如何操作,这⾥先给出⼀个简单的Json数组例⼦:[ 1, 2, 3, 4 ]1上述例⼦则表⽰了⼀个结构简单的Json数组,取其中元素的操作如各⾼级语⾔⼀般,可以使⽤”[]” + Index的⽅式,回顾上⼀篇JsonCpp的介绍,要取出Json数据中的某个元素的值,则应该将代表该数据的对象先获取得到,使⽤”[]” + Index即是获取了代表该数据的对象,之后再根据Json数据中的数据类型去执⾏Json::Value的成员⽅法asType(Type指代某种Json类型)。

下⾯给出操作上述例⼦的Json数组的代码://// main.cpp// TestJson//// Created by Morris on 2016/11/21.// Copyright © 2016年 Morris. All rights reserved.//#include <iostream>#include <fstream>#include <string>#include <json/json.h>int main(int argc, const char * argv[]){std::ifstream ifs;ifs.open("/Users/Morris/Code/cpp/test/test.json");Json::Value val;Json::Reader reader;if (!reader.parse(ifs, val)) {return -1;}int sz = val.size();for (int i = 0; i < sz; ++i) {std::cout << "Element " << i + 1 << ": ";std::cout << val[i].asInt();std::cout << std::endl;}return 0;}JsonCpp操作复杂Json数组对于Json数组,还有另外的⼀些复杂的情况,如Json数组是某⼀Json对象的⼀部分,或者Json数组中元素是复杂的Json对象。

jsoncpp 编译

jsoncpp 编译

jsoncpp 编译
jsoncpp是一个开源的C++库,可以用来读取、写入和创
建JSON格式的文件。

JSON(JavaScript Object Notation)是
一种轻量级的数据交换格式,它是一种文本标记,用于表示结构化的数据。

它由JavaScript设计,但是现在被广泛应用于其
他语言。

JSONcpp是一个用C++编写的JSON解析器和生成器,可以用来解析JSON文件,并灵活地创建JSON格式的文件。

JSONcpp可以很容易地编译,它可以在Windows,Mac
OS X,Linux等操作系统上编译和使用。

首先,需要安装CMake工具,以支持项目的构建,然后下载最新的JSONcpp
源代码,可以从Github上下载。

在安装完CMake之后,需要
创建一个新的文件夹,将JSONcpp源代码复制到该文件夹中,并使用CMake命令生成make文件。

在生成make文件之后,可以使用make命令编译JSONcpp库,并在编译期间把它链接到C++程序。

编译完成
之后,可以使用JSONcpp,在C++程序中使用JSONcpp类就
可以读取,写入和创建JSON格式的文件。

JSONcpp可以用于创建和处理复杂的JSON格式的文件,
可以很容易地编译,并且可以在不同的操作系统上运行。

它的灵活性可以帮助开发人员更轻松地处理JSON文件,并且它的
跨平台特性可以帮助开发人员轻松地将应用程序移植到不同的系统上。

C++操作json文件以及jsoncpp配置详解

C++操作json文件以及jsoncpp配置详解

C++操作json⽂件以及jsoncpp配置详解前⾔json⽂件是⽐较轻量级的⽂件,格式简单,使⽤⽅便。

⽤来存放信息相⽐其他⽅式有⾃⼰得天独厚的优势。

今天给⼤家分享的是如何利⽤C++来操作json⽂件。

如果你知道如何使⽤jsoncpp类库,可以不⽤看附,如果第⼀次使⽤,请先到最后,将环境配置好,再进⾏操作。

⼀、json⽂件简介1、json⽂件JSON(JavaScript Object Notation, JS 对象简谱) 是⼀种轻量级的数据交换格式。

它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个⼦集,采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。

简洁和清晰的层次结构使得 JSON 成为理想的数据交换语⾔。

易于⼈阅读和编写,同时也易于机器解析和⽣成,并有效地提升⽹络传输效率。

2、json与其他存储数据⽅式⽐较为什么要⽤json⽂件呢?我们最常使⽤的存储数据的⽅式有很多,⽐如利⽤txt⽂件存,利⽤xml存,利⽤word存,利⽤Excel存,如果我们要求⽐较⾼,还可以使⽤数据库存。

相对于txt,word来说,json格式更加明确,获取重要信息⾮常⽅便。

相对于xml来说,json格式更加简洁,存储同样的⽂件,花费的内存更⼩。

相对于Excel来说,json更适合存储字符类⽂件。

Excel相当于⽐较简单的数据库了。

相对于数据库来说,json更加⽅便,数据库我们还需要做⼀些设置,安装⼀些软件。

json可以直接使⽤。

⼆、C++操作json⽂件1、jsoncpp 库下载⼤家可以⾃⼰上⽹下载jsoncpp 库,2、C++从字符串中读取jsonjson样式⽐较多,这⾥分享两种,⼀种⽐较直接简单的,⼀种稍微有些复杂的。

1.简单json样式我们定义⼀个字符串来保存如下json数据:{"name" : "shuiyixin","age" : "21","sex" : "man"}读取代码如下:void readStrJson(){//字符串const char* str ="{\"name\":\"shuiyixin\",\"age\":\"21\",\"sex\":\"man\"}";Json::Reader reader;Json::Value root;//从字符串中读取数据if (reader.parse(str, root)){string name = root["name"].asString();int age = root["nomen"].asInt();string sex = root["sex"].asString();cout << name + "," << age << "," << sex << endl;}}2.复杂json样式所谓复杂,就是说,json⾥⾯分好⼏层,上⾯那个简单的只有⼀层,json数据如下:{"name":"shuiyixin","major":[{"AI":"MachineLearning"},{"AI":"DeepLearning"},{"AI":"ComputerVision"}]}读取代码如下:void readStrProJson(){string strValue = "{\"name\":\"shuiyixin\",\"major\":[{\"AI\":\"MachineLearning\"},{\"AI\":\"DeepLearning\"},{\"AI\":\"ComputerVision\"}]}"; Json::Reader reader;Json::Value value;if (reader.parse(strValue, value)){string out = value["name"].asString();cout << out << endl;const Json::Value arrayObj = value["major"];for (unsigned int i = 0; i < arrayObj.size(); i++){out = arrayObj[i]["AI"].asString();cout << out<<endl;}}}3、C++从⽂件中读取json从字符串中读取json⽂件只是为了让⼤家能够了解json⽂件,我们最终还是要从⽂件中读取的。

C++解析Json,使用JsonCpp读写Json数据

C++解析Json,使用JsonCpp读写Json数据

C++解析Json,使⽤JsonCpp读写Json数据(JavaScript Object Notation, JS 对象标记) 是⼀种轻量级的数据交换格式。

通常⽤于数据交换或存储。

是⼀个基于C++语⾔的开源库,⽤于C++程序的Json数据的读写操作。

JsonCpp是⼀个开源库使⽤其中最简单的⽅法是执⾏项⽬根⽬录中的python脚本,构建头⽂件和源⽂件。

1. 在安装Python环境的控制台中进⼊jsoncpp项⽬根⽬录,2. 执⾏命令:python amalgamate.py3. 将⽣成的dist⽬录拷贝到⾃⼰的项⽬中,其中包源⽂件jsoncpp.cpp和头⽂件json.h、json-forwards.h。

基本类和⽅法使⽤jsoncpp库时需要包含头⽂件#include <json/json.h>(包含⽬录根据需要修改)⽅法命名空间:Json常⽤类Value:⽤于存储Json数据CharReader:从字符串中读取Json数据的抽象类CharReaderBuilder:CharReader类的实现,可以读取标准输⼊流中的数据Demo定义Json数据结构,并输出数据Json::Value jsonRoot; //定义根节点Json::Value jsonItem; //定义⼀个⼦对象jsonItem["item1"] = "one"; //添加数据jsonItem["item2"] = 2;jsonRoot.append(jsonItem);jsonItem.clear(); //清除jsonItemjsonItem["item1.0"] = 1.0;jsonItem["item2.0"] = 2.0;jsonRoot["item"] = jsonItem;cout << jsonRoot.toStyledString() << endl; //输出到控制台将Json写⼊到⽂件ofstream ofs; //标准输出流ofs.open("sample.json"); //创建⽂件ofs << jsonRoot.toStyledString(); //输出ofs.close();从⽂件读取Json数据ifstream ifs; //标准输⼊流ifs.open("sample.json");jsonRoot.clear();Json::CharReaderBuilder builder;builder["collectComments"] = false;JSONCPP_STRING errs;if (!parseFromStream(builder, ifs, &jsonRoot, &errs)) //从ifs中读取数据到jsonRoot{return;}从字符串读取Json数据string jsonStr = jsonRoot.toStyledString(); //json字符串jsonRoot.clear();Json::CharReaderBuilder builder;builder["collectComments"] = false;JSONCPP_STRING errs;Json::CharReader* reader = builder.newCharReader();if (!reader->parse(jsonStr.data(), jsonStr.data() + jsonStr.size(), &jsonRoot, &errs)) //从jsonStr中读取数据到jsonRoot {return;}获取Json中的键值对for (auto i = 0; i < jsonRoot.size(); i++)//遍历数组[]{for (auto sub= jsonRoot[i].begin(); sub != jsonRoot[i].end(); sub++)//遍历对象{}{cout << () << " : " << jsonRoot[i][()] << endl; //⽅法1cout << () << " : " << (*sub) << endl; //⽅法2} }eg:jsonRoot=[{"item1" : 1,"item2" : 2,},{"a" : "a","b" : 2.0,}]。

VC下jsoncpp的使用入门

VC下jsoncpp的使用入门

VC下jsoncpp的使用入门一、摘要JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记Javascript 对象的,JSON 官方的解释为:JSON 是一种轻量级的数据传输格式。

本文并不详细介绍JSON 本身的细节,旨在讨论如何使用C++ 语言来处理JSON。

关于JSON 更具体的信息,可参见JSON 官网:。

二、jsoncpp 在Windows 下的编译要使用第三方源码库,第一步少不了的就是编译,将源码文件编译成我们方便使用的动态链接库、静态链接库或者静态导入库[1]。

jsconcpp 进行JSON 解析的源码文件分布在include/json、src/lib_json 下。

其实jsoncpp 源码并不多,为了方便产品管理,此处没必要将其编译为动态链接库或者静态导入库,所以我们选择使用静态链接库[2]。

jsoncpp 已经处理的很完善了,所有编译选项都已经配置好,打开makefiles/vs71/jsoncpp.sln 便可以开始编译(默认是使用VS2003 编译器的,打开时直接按照VS2005 提示转换即可)。

三、静态链接库的使用VC中使用静态库的方法#pragma comment(lib, “xxx.lib”)但在编译你应用程序时可能出现类似如下的错误1>libcmtd.lib(invarg.obj):error LNK2005: __invoke_watson已经在MSVCRTD.lib(MSVCR90D.dll) 中定义1>libcmtd.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount已经在MSVCRTD.lib(MSVCR90D.dll) 中定义1>libcmtd.lib(tidtable.obj) : error LNK2005: __encode_pointer已经在MSVCRTD.lib(MSVCR90D.dll) 中定义1>libcmtd.lib(tidtable.obj) : error LNK2005: __decode_pointer已经在MSVCRTD.lib(MSVCR90D.dll) 中定义……解决办法是在编译jsoncpp的lib时,选择动态运行时库开关对应的库版本/MD MSVCPRT.LIB多线程DLL的Release版本/MDd MSVCPRTD.LIB多线程DLL的Debug版本/MT LIBCPMT.LIB多线程静态链接的Release版本/MTd LIBCPMTD.LIB多线程静态链接的Debug版本四、jsoncpp 使用详解jsoncpp 主要包含三种类型的class:Value、Reader、Writer。

jsoncpp用法

jsoncpp用法

jsoncpp用法JSONCpp 是一个免费且开源的C++ JSON 解析库,它使用 MIT 许可证发布,旨在提供一种快速和行之有效的方式来解析和构建 JSON 语法格式的文档。

JSONCpp 对 C++ 和JavaScript 等语言均支持。

JSONCpp 包含一系列类,比如 Value 类、Reader 类和 Writer 类,可以用来定义和处理 JSON 语法格式的文档。

Value 类是最重要的核心类,它用于描述 JSON 文档中的元素,比如 null、Boolean、Array、Object、Number 和 String。

该类不仅能用来存储JSON 文本,也可以在 Value 对象中处理这些元素。

Reader 类用于从 JSON 文档中解析和读取信息,Writer 类用于构建 JSON 文档。

JSONCpp 的 API 设计很简单,能帮助开发者很快的掌握,解析 JSON 语法格式的文档也很方便。

1. 首先,引入需要的头文件:#include<jsoncpp/json/json.h>2. 然后,创建 Value 对象,用于存储 JSON 文档的元素:Json::Value root;3. 接着,使用 Reader 类读取文档:Json::Reader reader;4. 最后,调用 parse() 方法,解析 JSON 文档:if (reader.parse(strJson, root)){// parse success}另外,Writer 类可以用于构建 JSON 文档。

开发者可以用它来创建一段新的 JSON 文档,使用下面的步骤:2. 然后设置节点的值:root["Name"] = "John";root["Age"] = 20;4. 最后,调用 write() 方法,把文档写入到字符串中: writer.write(root, strJson);。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Jsoncpp库使用说明Jsoncpp是一个使用C++语言实现的面向对象的json库Jsoncpp提供的接口中有3个核心类:Reader、Writer、Value。

Reader类负责从字符串或者输入流中加载JSON文档,并进行解析,生成代表JSON文档的Value对象。

Writer类负责将内存中的V alue对象转换成JSON文档,输出到文件或者是字符串中。

Value类的对象代表一个JSON值,既可以代表一个文档,也可以代表文档中一个值。

如同JSON中定义的“值”一样,Value是递归的。

解析JSON文档解析一个JSON文档的大致过程如下://生命顶级Value对象Json::Value root;//读取文档:Std::string strdoc = readFromFile(…);//声明Reader对象Json::Reader _reader;//解析json文档_reader.paser(strdoc, root);Json::ValueType有8种,以下是定义。

enum Json::ValueTypeType of the value held by a Value objec t.Enumerator:nullValue'null' valueintValue signed integer valueuintValue unsigned integer valuerealValue double values tringValue UTF-8s tring value.booleanValue bool valuearrayValue array value (ordered lis t)objectValue objec t value (c ollection of name/value pairs).//从root中提取数据,基本模式如下函数所示,其中PARAM out只是抽象的占位符,代表用来保存从Value中提取的数据的对象,并不是一个实际实现的类。

static voidprintValueTree( FILE *fout, Json::Value &value, const std::string &path = "." ){switch ( value.type() ){case Json::nullValue:fprintf( fout, "%s=null\n", path.c_str() );case Json::intValue:fprintf( fout, "%s=%d\n", path.c_str(), value.asInt() );break;case Json::uintValue:fprintf( fout, "%s=%u\n", path.c_str(), value.asUInt() );break;case Json::realValue:fprintf( fout, "%s=%.16g\n", path.c_str(), value.asDouble() );break;case Json::stringValue:fprintf( fout, "%s=\"%s\"\n", path.c_str(), value.asString().c_str() );break;case Json::booleanValue:fprintf( fout, "%s=%s\n", path.c_str(), value.asBool() ? "true" : "false" ); break;case Json::arrayValue:{fprintf( fout, "%s=[]\n", path.c_str() );int size = value.size();for ( int index =0; index < size; ++index ){static char buffer[16];sprintf( buffer, "[%d]", index );printValueTree( fout, value[index], path + buffer );}}break;case Json::objectValue:{fprintf( fout, "%s={}\n", path.c_str() );Json::Value::Members members( value.getMemberNames() );std::sort( members.begin(), members.end() );std::string suffix = *(path.end()-1) == '.' ? "" : ".";for ( Json::Value::Members::iterator it = members.begin();it != members.end();++it ){const std::string &name = *it;printValueTree( fout, value[name], path + suffix + name );}}break;default:}}从内存中创建Value对象在需要将内存数据转换为JSON时就需要从内存中创建一个Value对象,然后再转化为文本进行输出。

如果是一个简单的Value值,如布尔、数值、空值、字符串等,则直接使用构造函数创建Value。

如:Value(datatype);如果要创建一个对象类型的Value,首先使用Value root(ValueType type = objectValue)声明一个空的类型为对象的Value对象。

然后使用类似于root[“type”] = “USER_INFO”的表达式,往root中添加属性(key/value 对)。

如果要创建一个数组类型的Value,首先使用Value root(ValueType type = arrayValue)声明一个空的类型为数组的Value对象。

然后使用root.append(Value&)成员,在数组的末尾追加一个值,或者使用root[index]来访问数组的元素。

如果index值超出了当前数组的长度,那么将会在数组末尾追加一个元素,并返回这个元素的引用。

要创建代表如下JSON文档的Value对象:{"Type": "USER_INFO","Data": {"id": 1,"name": "spring","server": {"homeserver": 1001,"vistserver": 1003},"skillids": [1,3,5]}}需要如下代码://声明object类型的对象,根对象Value root(objectValue);//添加Type属性这里隐含自动类型转换,将string转化为ValueRoot[“Type”] = “USER_INFO”;Value Data(objectValue);//下面创建Data子对象Data[“id”] = 1;Data[“name”] = “spring”;Value _server(objectValue);_server[“homeserver”] = 1001;_server[“vistserver”] = 1003;Data[“server”] = _server;Value _skillids(objectValue);_skillids.append(1);_skillids.append(3);_skillids.append(3);Data[“skillids”] = _skillids;Root[“Data”] = Data;至此root对象构建完毕Value转换为JSON文档Jsoncpp提供了几个类可以完成这个任务,虽然稍有不同,但基本一样,尽在排版风格上稍有差异。

以简单的FastWriter为例:Json:: FastWriter writer;String _jsondoc = writer.write( root );_jsondoc中即包含了输出的JSON格式的文档。

如何将JsonCpp引入到自己C++的工程。

下载JsonCpp源码包jsoncpp-src-0.5.0.tar.gz/projects/jsoncpp/解压tar -zxvf jsoncpp-src-0.5.0.tar.gz提取解压目录下的include/json 和src/lib_json/ 两个文件夹到自己的工程根目录下。

比如分别复制到自己工程目录下的include/josn 和src/jsoncpp 中。

工程下的lib文件夹用来存放链接库文件。

编译静态链接库文件libjson.ag++ -c -g -Wall -I. -I../../include json_reader.cpp -o json_reader.og++ -c -g -Wall -I. -I../../include json_value.cpp -o json_value.og++ -c -g -Wall -I. -I../../include json_writer.cpp -o json_writer.oar rc libjson.a json_reader.o json_value.o json_writer.编译动态链接库文件libjson.sog++ -c -g -Wall -fPIC -I. -I../../include json_reader.cpp -o json_reader.o g++ -c -g -Wall -fPIC -I. -I../../include json_value.cpp -o json_value.og++ -c -g -Wall -fPIC -I. -I../../include json_writer.cpp -o json_writer.o g++ -shared json_reader.o json_value.o json_writer.o -lpthread -o libjson.s下面是一个简单的用例,项目中如何使用编译好的jsoncpp 库。

相关文档
最新文档