当前位置:首页 » 编程软件 » 编译jsoncpp

编译jsoncpp

发布时间: 2022-10-22 20:18:09

A. VS2017编译jsoncpp我出现的问题及怎么解决的

文件-新建-项目-选c++-win32控制台程序-一步一步向下,完成新建后,再看解决方案管理器,树状结构最下面有个“源代码”文件夹,如果里面已经有cpp,就粘贴你的代码,如果没有,就右键-新建cpp源文件,再粘贴代码,然后才能编译。如果你都没看到这些菜单的话说明你的vs2017没装c++相关的组件。

B. JSON中数组该如何解析呢c++中使用jsoncpp

JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择
JSON的全称为:javaScript Object Notation ,顾名思义,JSON是用于标记javascript对象的,详情参考http://www.json.org/。
本文选择第三方库JsonCpp来解析json,JsonCpp是比较出名的c++解析库,在json官网也是首推的。
JsonCpp简介
JsonCpp主要包含三种类型的class:Value Reader Writer。
jsoncpp中所有对象、类名都在namespace json中,包含json.h即可。
注意: Json::Value只能处理ANSI类型的字符串,如果C++程序使用Unicode编码的,最好加一个Adapt类来适配。
下载和编译
本文运行环境是: Redhat 5.5 + g++version 4.6.1 + GNU Make 3.81 + jsoncpp-0.5.0
下载地址是:http://sourceforge.net/projects/jsoncpp/
解压之后得到jsoncpp-src-0.5.0文件夹,我们只需要jsoncpp的头文件和cpp文件,其中jsonscpp的头文件位于jsoncpp-src-0.5.0includejson,jsoncpp的cpp文件位于jsoncpp-src-0.5.0srclib_json。
这里我列出我们的工作目录:
jsoncpp/ //工作目录
|-- include //头文件根目录
| |-- json //json头文件,对应jsoncpp-src-0.5.0includejson
|-- src //cpp源码文件根目录
|-- json //jsoncpp源码文件,对应jsoncpp-src-0.5.0srclib_json
|-- main.cpp //我们的主函数,调用jsoncpp的示例代码
|-- makefile //makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践
反序列化Json对象
假设有一个json对象如下:

{ "name": "json″, "array": [ { "cpp": "jsoncpp" }, { "java": "jsoninjava" }, { "php": "support" } ] }

我们要实现这个json的反序列号代码如下:
voidreadJson() { usingnamespacestd; std::stringstrValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}"; Json::Reader reader; Json::Value value; if(reader.parse(strValue, value)) { std::stringout= value["name"].asString(); std::cout <<out<<std::endl; constJson::Value arrayObj = value["array"]; for(unsigned inti = 0;i <arrayObj.size(); i++) { if(!arrayObj[i].isMember("cpp")) continue; out= arrayObj[i]["cpp"].asString(); std::cout <<out; if(i != (arrayObj.size() - 1)) std::cout <<std::endl; } } }

序列化Json对象
voidwriteJson() { usingnamespacestd; Json::Value root; Json::Value arrayObj; Json::Value item; item["cpp"] = "jsoncpp"; item["java"] = "jsoninjava"; item["php"] = "support"; arrayObj.append(item); root["name"] = "json"; root["array"] = arrayObj; root.toStyledString(); std::stringout= root.toStyledString(); std::cout <<out<<std::endl; }

C. 怎么将jsoncpp编译成lib文件

比如你在VC6.0有一个工程project,里面有以下3个文件

/*1*/fun.h
#ifndef FUN_H
#define FUN_H
void fun();
#endif

/*2*/fun.c
#include <stdio.h>
#include "fun.h"
void fun()
{
printf("fun()");
}

/*3*/main.c
#include <stdio.h>
#include "fun.h"
int main()
{
fun();
getchar();
}

菜单project->setting->link
把输出文件名“Debug/project.exe”改成“Debug/project.lib”,确定
按F7组建project.lib
这样在你的project\Debug文件夹下就可以找到project.lib了

D. jsoncpp linux下怎么编译

# tar zxvf scons-2.1.0.tar.gz
# tar zxvf jsoncpp-src-0.5.0.tar.gz

设定环境变量【关键】,绝对路径
# export MYSCONS=解压的路径
# export SCONS_LIB_DIR=$MYSCONS/engine

# cd jsoncpp-src-0.5.0
# python $MYSCONS/script/scons platform=linux-gcc
编译成功后,在在jsoncpp-src-0.5.0/libs/目录下找到相应的*.a和*.so
可以修改为:mv libjson_linux-gcc-4.4.6_libmt.so libjson.so


0

E. linux下jsoncpp-src-0.5.0.tar.gz怎么用指令安装

jsoncpp-src-0.5.0.tar.gz这是一个源文件包。

所以要自己手动编译,安装。


Step1: 解压

tarzxvfjsoncpp-src-0.5.0.tar.gz


Step2: 编译和安装(一般都是如此安装,如果configure失败,请根据提示安装依赖)

cd解压后的路径
./configure--prefix=安装路径(绝对路径)。
make
makeinstall

这一步做完, 可执行文件和头文件等已到 “安装路径”。


Step3:执行程序

cd安装路径

找到可执行文件, 即可执行。

F. c++ 编译问题

这个问题是你的编译命令写错了,你给出了头文件的地址和库文件的地址,但是你链接的时候没有给出lib所在的地址,你的编译命令应该写成如下形式:

$(CC) $(FLAGS) test2.c -I$(JSON_H) -L$(JSON_LIB) -l****
其中***表示的是你要链接的库的名字,比如你要链接的库是libjson.so(这是linux的形式,windows下是.lib)
那么***就写成json,其中***前面的是-l(L小写,不是i的大写)
这样你就能链接成功了

G. jsoncpp和rapidjson哪个好用

程序员的秘诀是:编程、编程、再编程。


  • 简单性

    真的对这个问题一窍不通,但是专人说:Rapidjson是全部都在第一个总文件里,jsoncpp要求您构建或编译一个库;但rapidjson的一些接口不全,只提供了一层一层的这种解析方式,不能将某一层一次读出来,实际用的时候,要简单封装一下,不然代码量会很大。


  • 总结

    其实这种类似程序的东西我真的毫无涉猎,不过以后可以尝试看看。这个库使用了大量c++ 11标准元素,并且库的设计也符合一些STL标准,可配置性比较强;单文件方式,引用也比较方便;使用上,也有其独到的地方,更接近JSON的本质;此外性能上还是不错的,只是比rapidjson差,比libjson,jsoncpp之流还是强了不少

H. 怎么在VS2008里使用jsoncpp

C++要使用JSON来解析数据,一般采用jsoncpp.

下载jsoncpp后,按ReadMe文档的说法是要先安装的,但是安装比较麻烦。然而事实上,我们并不需要安装,就可以直接使用。

方法一:直接拷贝源文件。这个方法比较简单,但不推荐,因为不便于项目管理。

  1. VS2008里新建一个空的控制台程序(用作测试jsoncpp是否可用),名为: TestJSON

  2. 解压下载好的文件:jsoncpp-src-0.5.0.tar.gz

  3. 将 jsoncpp-src-0.5.0include 目录下的json文件夹拷贝至 TestJSON 工程目录下

  4. 将jsoncpp-src-0.5.0srclib_json 目录下的所有.h, .cpp文件全部拷贝至 TestJSON 工程目录下

  5. 在VS2008里引入工程目录下刚刚从jsoncpp-src-0.5.0 导入的文件,如图1

  6. 在VS2008里新建main.cpp来测试jsoncpp是否可用。代码见文章末尾main.cpp


方法二:使用静态链接库

  1. VS2008里新建一个空的控制台程序(用作测试jsoncpp是否可用),名为: TestJSON

  2. 解压下载好的文件:jsoncpp-src-0.5.0.tar.gz

  3. 利用VS2008打开jsoncpp-src-0.5.0makefilesvs71目录下的jsoncpp.sln,会出现三个Project:jsontest,lib_json,test_lib_json

  4. 在lib_json上 右击-->Properties-->Configuration Properties-->C/C++-->Code Generation,注意右侧的Runtime Library的内容,如图2,看完箭头所指的东西就可以点确定,关掉属性页。

  5. 编译lib_json,显示编译成功后,在jsoncpp-src-0.5.0uildvs71debuglib_json目录下会生成一个json_vc71_libmtd.lib,将这个lib拷贝至TestJSON工程目录下。

  6. 将jsoncpp-src-0.5.0includejson目录下的所有.h文件拷贝至TestJSON工程目录下,并在工程Header Files引入.

  7. 将方法一里的main.cpp添加到工程中,并在工程名上 右击-->Properties-->Configuration Properties-->C/C++-->Code Generation, 将Runtime Library改成图2箭头所示内容。

  8. 在工程名上右击-->Properties-->Configuration Properties-->Linker-->Input, 在Additional Dependencies里填写json_vc71_libmtd.lib,然后确定,编译就行了。


/* 测试jsoncpp的使用
*/

#include<iostream>
#include"json/json.h"

usingnamespacestd;
usingnamespaceJson;//json的命名空间

intmain()
{
/*JSONDATAasfollowing://一个json类型的数据
{
"test:5
}*/

stringtest="{"test":5}";//保存上文的json类型的数据

//以下涉及json的操作,将在后文中涉及,此处为简单应用,不解释,你懂的
Readerreader;
Valuevalue;

if(reader.parse(test,value))
{
inti=0;

if(!value["test"].isNull())
{
i=value["test"].asInt();
cout<<i<<endl;
}
}

return0;
}

I. C++ json解析

C++ 解析Json——jsoncpp
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录。
Jsoncpp是个跨平台的开源库,下载地址:http://sourceforge.net/projects/jsoncpp/,我下载的是v0.5.0,压缩包大约104K。

方法一:使用Jsoncpp生成的lib文件
解压上面下载的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目录里找到jsoncpp.sln,用VS2008版本编译,默认生成静态链接库。 在工程中引用,只需要包含include/json下的头文件及生成的.lib文件即可。
如何包含lib文件:在.cpp文件中#pragma comment(lib."json_vc71_libmt.lib"),在工程属性中Linker下Input中Additional Dependencies写入lib文件名字(Release下为json_vc71_libmt.lib,Debug为json_vc71_libmtd.lib)

注意:Jsoncpp的lib工程编译选项要和VS工程中的编译选项保持一致。如lib文件工程编译选项为MT(或MTd),VS工程中也要选择MT(或MTd),否则会出现编译错误问题,debug和release下生成的lib文件名字不同,注意不要看错了,当成一个文件来使用(我就犯了这个错误)。

方法二:使用Jsoncpp包中的.cpp和.h文件
解压上面下载的Jsoncpp文件,把jsoncpp-src-0.5.0文件拷贝到工程目录下,将jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json和jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json目录里的文件包含到VS工程中,在VS工程的属性C/C++下General中Additional Include Directories包含头文件目录.\jsoncpp-src-0.5.0\include。在使用的cpp文件中包含json头文件即可,如:#include "json/json.h"。将json_reader.cpp、json_value.cpp和json_writer.cpp三个文件的Precompiled Header属性设置为Not Using Precompiled Headers,否则编译会出现错误。

jsoncpp 使用详解
jsoncpp 主要包含三种类型的 class:Value、Reader、Writer。jsoncpp 中所有对象、类名都在 namespace Json 中,包含 json.h 即可。
Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。

下面是从网上找的代码示例:
1. 从字符串解析json

const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";

Json::Reader reader;
Json::Value root;
if (reader.parse(str, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
std::string upload_id = root["uploadid"].asString(); // 访问节点,upload_id = "UP000000"
int code = root["code"].asInt(); // 访问节点,code = 100
}
2. 从文件解析json

int ReadJsonFromFile(const char* filename)
{
Json::Reader reader;// 解析json用Json::Reader
Json::Value root; // Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array

std::ifstream is;
is.open (filename, std::ios::binary );
if (reader.parse(is, root, FALSE))
{
std::string code;
if (!root["files"].isNull()) // 访问节点,Access an object value by name, create a null member if it does not exist.
code = root["uploadid"].asString();

code = root.get("uploadid", "null").asString();// 访问节点,Return the member named key if it exist, defaultValue otherwise.

int file_size = root["files"].size(); // 得到"files"的数组个数
for(int i = 0; i < file_size; ++i) // 遍历数组
{
Json::Value val_image = root["files"][i]["images"];
int image_size = val_image.size();
for(int j = 0; j < image_size; ++j)
{
std::string type = val_image[j]["type"].asString();
std::string url = val_image[j]["url"].asString();
printf("type : %s, url : %s \n", type.c_str(), url.c_str());
}
}
}
is.close();

return 0;
}
3. 向文件中插入json

void WriteJsonData(const char* filename)
{
Json::Reader reader;
Json::Value root; // Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array

std::ifstream is;
is.open (filename, std::ios::binary );
if (reader.parse(is, root))
{
Json::Value arrayObj; // 构建对象
Json::Value new_item, new_item1;
new_item["date"] = "2011-11-11";
new_item1["time"] = "11:11:11";
arrayObj.append(new_item); // 插入数组成员
arrayObj.append(new_item1); // 插入数组成员
int file_size = root["files"].size();
for(int i = 0; i < file_size; ++i)
root["files"][i]["exifs"] = arrayObj; // 插入原json中
std::string out = root.toStyledString();
// 输出无格式json字符串
Json::FastWriter writer;
std::string strWrite = writer.write(root);
std::ofstream ofs;
ofs.open("test_write.json");
ofs << strWrite;
ofs.close();
}

is.close();
}

热点内容
游程编码c语言 发布:2025-05-16 21:26:51 浏览:586
帝来哪个配置值得购买 发布:2025-05-16 21:12:29 浏览:462
什么是nodejs前端服务器 发布:2025-05-16 21:12:17 浏览:405
编译选项立即绑定未定义符号 发布:2025-05-16 20:55:13 浏览:906
linuxmysql慢日志 发布:2025-05-16 20:47:58 浏览:271
村两委有哪些配置 发布:2025-05-16 20:34:47 浏览:293
我的世界有什么服务器好玩的 发布:2025-05-16 20:28:57 浏览:484
c语言按位与运算 发布:2025-05-16 20:24:10 浏览:755
苹果手机如何修改密码安全 发布:2025-05-16 20:23:34 浏览:193
图片文字识别算法 发布:2025-05-16 20:21:54 浏览:46