Linux下C++操作libjsoncpp

  1. jsoncpp库编译
    安装包

    scons-2.5.0.tar.gz

    Scons是一个以Python语言编码为基础的自动化构建工具,可用来替代make编写复杂的makefile。本次使用目的是为了编译jsoncpp

    jsoncpp-src-0.5.0.gz

    jsoncpp源代码包

    安装步骤:(注原系统环境中如有scons的话请供参考,按本次操作完成后可能会影响python的环境)

cd /usr/local/
mkdri risen
cd risen

//将scons及jsoncpp安装包拷贝到risen文件夹

//解压scons安装包
tar -zxvf scons-2.5.0.tar.gz

//解压jsoncpp安装包
tar -zxvf jsoncpp-src-0.5.0.gz

设置scons环境
export MYSCONS=/usr/local/risen/scons-2.5.0
export SCONS_LIB_DIR=$MYSCONS/engine
//刷新环境
source  /etc/profile

cd  jsoncpp-src-0.5.0
python $MYSCONS/script/scons platform=linux-gcc       

//把源码中的include/json文件夹拷贝到/usr/local/include目录下
cp /usr/local/risen/jsoncpp-src-0.5.0/include/json/ /usr/local/include/ -rf
//把生成的json_linux-gcc-4.8.5_libmt.a和json_linux-gcc-4.8.5_libmt.so文件拷贝到/usr/local/lib目录下。
cp /usr/local/risen/jsoncpp-src-0.5.0/libs/linux-gcc-4.8.5/* /usr/local/lib/ -rf

//在根目录下:
vim /etc/ld.so.conf
//在 /etc/ld.so.conf 下加入 /usr/local/lib 这一行,保存。
// 更新一下配置。
/sbin/ldconfig -v 
  1.  vs2017配置jsoncpp

右键工程[属性]->[VC++目录]->[包含目录]中添加/usr/local/include,[库目录]添加/usr/local/lib/

  1. C++操作jsoncpp

头文件CJson.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <malloc.h>
#include <string.h>
#include <memory.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>

#include "json/json.h"

using namespace std;



class CJson
{
public:
	CJson();
	~CJson();

	//添加自己要格式化JSON或解析JSON的方法
};

  • json简介

JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)。

JSON的书写格式是key:value。

key表示的是名称,value是对应的值。value可以是null、布尔值、数字、字符串、数组、对象等。我们下面以一个人为对象建立json。下面简单列一下人的属性清单:

"人"属性清单
属性名称key内容类型备注
姓名name老王字符串还是中文字符串
当前年龄age29整形数值
是个人了?person?true布尔型
前女友数量ex-girlfriendnum0.5浮点数已经心死了,勉强算半个
口袋里面的钞票moneynullnull...        
年龄趋势agetrend1.2.3...29数组
家人 family父母...对象数组
对象currentgirlfriend对象对象真的是对象

json value为null的表示方法:

{"money":null}
//或
{"money":""}

json value为布尔值的表示方法:

{"person":true}

 json value为数字的表示方法:

{"age":29}                        //整形表示方法
{"ex-girlfriendnum":0.5}          //浮点型表示方法

 json value为字符串的表示方法:

{"name":"老王"}

 json value为数组的表示方法:

{
    "agetrend":   
    [
        1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29
    ]
}

 json value为对象的表示方法:

{
    "currentgirlfriend":
    {
        "name":"老白",
        "age":18
    }
}

 json value为对象数组的表示方法:

{
    "family":
    [
        {"name":"老王头","age":52},
        {"name":"老王头太太","age":53},
    ]
}
  • 格式化json字符串
#pragma once
#include "CJson.h"

void main()
{
    Json::FastWriter		l_JsonStr;        //将json转成字符串
    Json::Value	l_PersonWzx;
    int l_iAge = 29;
    l_PersonWzx["name"] = "老王";             //字符串
    l_PersonWzx["age"] = l_iAge;              //整形数值29
    l_PersonWzx["person?"] = true;            //布尔型
    l_PersonWzx["ex-girlfriendnum"] = 0.5;    //浮点型数值
    l_PersonWzx["money"] = "";                //null

    for(int i=0;i<l_iAge;i++)
        l_PersonWzx["agetrend"].push_back(i+1);    //数组

    Json::Value	l_Father;
    Json::Value	l_Mother;
    Json::Value	l_Girlfriend;

    l_Father["name"] = "老王头";
    l_Father["age"] = 52;
    l_PersonWzx["family"].push_back(l_Father);

    l_Mother["name"] = "老王头太太";
    l_Mother["age"] = 53;
    l_PersonWzx["family"].push_back(l_Mother);    //对象数组
    
    l_Girlfriend["name"] = "老白";
    l_Girlfriend["age"] = 18;
    l_PersonWzx["currentgirlfriend"] = l_Girlfriend;    

    cout << l_JsonStr.write(l_PersonWzx) << endl;
    return;
}

由于中文编码的问题,"name"无法显示中文; 

使用高级隐藏技能,三种方法让中文显示出来。因为mobaXterm显示的时候使用的是utf-8的编码,c++代码我默认的是简体中文gb2312,中文乱码是因为编码不一致导致的。

方案一:将mobaXterm展示方式修改为gb2312;右键连接,点击编辑连接[Edit session],点击[Terminal settings]下面的[Terminal fonts settings],将编码显示GB2312,重新打开链接。

方案二:在vs2017,通过高级保存选项将代码的文件属性改成utf-8。随后重新编译即可。

方案三:使用iconv库将"name"对应的中文内容进行格式转换,将编码转换成utf-8后再存入"name"中重新编译即可。但在jsoncpp库内部对有些中文编码进行特殊处理过,因此需要修改jsoncpp底层的代码。

 执行成功后如下图:

  •  解析json字符串

计算机联网情况下网址输入:json.cn    可以在线解析json字符串

解析字符串以下面JSON为对象进行解析:

{"age":29,"agetrend":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"currentgirlfriend":{"age":18,"name":"老白"},"ex-girlfriendnum":0.50,"family":[{"age":52,"name":"老王头"},{"age":53,"name":"老王头太太"}],"money":"","name":"老王","person?":true}

struct Person
{
    std::String m_sName;
    int         m_iAge;
};

struct PersonWzx
{
    std::string m_sName;
	bool        m_bperson;
	int         m_iAge;
	float       m_fEX_Girlfriendnum;
	std::string m_sMoney;
	std::vector<int>    m_iAgeTrend;
	Person      m_GirlFriend;
	std::vector<Person> m_Family;
};

int main()
{ 
    std::string l_str = "{\"age\":29,\"agetrend\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],\"currentgirlfriend\":{\"age\":18,\"name\":\"老白\"},\"ex-girlfriendnum\":0.50,\"family\":[{\"age\":52,\"name\":\"老王头\"},{\"age\":53,\"name\":\"老王头太太\"}],\"money\":\"\",\"name\":\"老王\",\"person?\":true}";

	Json::Reader reader;
	Json::Value l_PersonWzx;
	PersonWzx   l_Wzx;

	if (reader.parse(l_str, l_PersonWzx))
	{
		if (!l_PersonWzx["name"].isNull())    //判断key所对应的值是否为空
		{
			l_Wzx.m_sName = l_PersonWzx["name"].asCString();     //以字符串形式提取
			cout << "name :"<< l_Wzx.m_sName <<endl;
		}

		if (!l_PersonWzx["age"].isNull())
		{
			l_Wzx.m_iAge = l_PersonWzx["age"].asInt();            //以整形方式提取
			cout << "age :" << l_Wzx.m_iAge << endl;
		}

		if (!l_PersonWzx["person?"].isNull())
		{
			l_Wzx.m_bperson = l_PersonWzx["person?"].asBool();    //以布尔型提取
			cout << "person? :" << l_Wzx.m_bperson << endl;
		}

		if (!l_PersonWzx["ex-girlfriendnum"].isNull())
		{
			l_Wzx.m_fEX_Girlfriendnum = (float)l_PersonWzx["ex-girlfriendnum"].asDouble();                            //以浮点型提取
			cout << "ex-girlfriendnum :" << l_Wzx.m_fEX_Girlfriendnum << endl;
		}

		if (!l_PersonWzx["money"].isNull())
		{
			l_Wzx.m_sMoney = l_PersonWzx["money"].asCString();
			cout << "money :" << l_Wzx.m_sMoney << endl;
		}

		if (!l_PersonWzx["agetrend"].isNull())
		{
			for (int i = 0; i < l_PersonWzx["agetrend"].size(); i++)
			{
				int l_iAgeTemp = l_PersonWzx["agetrend"][i].asInt();
				l_Wzx.m_iAgeTrend.push_back(l_iAgeTemp);
				cout << "agetrend Index:" << i <<"agetrend"<< l_iAgeTemp << endl;
			}
		}

		if (!l_PersonWzx["family"].isNull())
		{
			for (int i = 0; i < l_PersonWzx["family"].size(); i++)
			{
				Person l_TempPerson;
				l_TempPerson.m_sName = l_PersonWzx["family"][i]["name"].asCString();
				l_TempPerson.m_iAge = l_PersonWzx["family"][i]["age"].asInt();
				l_Wzx.m_Family.push_back(l_TempPerson);
				cout << "family Index:" << i << "name" << l_TempPerson.m_sName << "age" << l_TempPerson.m_iAge << endl;
			}
		}

		l_Wzx.m_GirlFriend.m_sName = l_PersonWzx["currentgirlfriend"]["name"].asCString();
		l_Wzx.m_GirlFriend.m_iAge = l_PersonWzx["currentgirlfriend"]["age"].asInt();
		cout << "currentgirlfriend:" << "name" << l_Wzx.m_GirlFriend.m_sName << "age" << l_Wzx.m_GirlFriend.m_iAge << endl;
	}
}

运行结果如下:

 以上是针对json的null、布尔值、数值、字符串、数组、对象、对象数组的构建与解析举例说明全部内容,欢迎交流讨论。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Linux下C++开发是一种非常流行的编程方式,它可以利用Linux操作系统的优势,如高效、稳定和安全等特点,来进行C++程序的开发。在Linux下,C++开发者可以使用各种开发工具和库,如GCC编译器、Makefile、GDB调试器、Boost库等,来提高开发效率和程序质量。此外,Linux下C++开发还可以利用开源社区的力量,获取更多的资源和支持,从而更好地完成项目开发。 ### 回答2: Linux下C语言开发是一种基于Linux操作系统的程序开发方式,其最大的特点是开放源代码以及高度可自由配置的性质。Linux作为一款优秀的开源操作系统,广泛应用于互联网、移动设备和服务器等领域,其稳定、高效的运行性能和运维优势已深受众多企业和开发人员的青睐。 在Linux下使用C语言进行开发,需要掌握一定的基础知识和技能。首先,需要了解Linux系统的基本命令和操作,对于C语言的基础语法也需要掌握。其次,需要选择一款适合自己的C语言编译器,比如常用的gcc。针对Linux特殊的操作环境和调试、编译等方面,也需要额外学习相应的技能。 在进行Linux下C语言开发时,首先需要确定开发目标。目前,在Linux下的C语言开发可以包括应用程序、系统程序、嵌入式开发等。针对不同的开发目标,需要使用不同的开发工具和编译器。 在编写程序时,需要注意Linux系统的特殊性。比如,在Linux下开发时需要使用头文件"unistd.h",使用fork()函数来创建新的进程。此外,由于Linux是多用户系统,所以需要进行用户和权限管理。同时,还需要注意程序的异常处理和错误输出等方面。 总的来说,Linux下的C语言开发是一项具有挑战性的工作,但其广泛应用和灵活性也为开发人员提供了很大的创造空间。通过深入的学习和实践,开发人员可以掌握Linux下C语言开发技能,为自己的事业发展和成长打下坚实的基础。 ### 回答3: 作为一位开发人员,从Windows转到Linux上做C开发,会面临不少挑战和改变。首先需要熟悉Linux操作系统结构和命令行,了解不同的发行版之间的差异,这对于日常的开发来说非常重要。以下是几个值得注意的方面: 1.开发环境 最基础的开发环境包括GCC和GDB,这些开源工具在Linux上免费获得。如果需要集成开发环境(IDE),则可以选择Eclipse、Code::Blocks或者KDevelop。在部署时,通常使用GNU Autotools或CMake自动化构建工具。 2.编译器 在Linux上,GCC是一个标准的编译器,它支持多个平台和架构上的编译,包括ARM、x86、PPC和MIPS。GCC 的源代码是开源的,使得开发人员可以通过了解源代码的方式来增强对编译器的理解。 3.调试工具 调试工具推荐使用 GDB,这是一个命令行工具,可以进行高效的调试,以及研究你的代码中有可能出现的漏洞或者错误。另外,Valgrind工具可以用来检测内存泄漏问题以及程序的性能分析。 4.Linux 系统调用 Linux系统提供了大量的系统调用,其中一些是比较常用的,如read( ),write( ),open( )和close( )。开发人员需要从C标准库中了解并使用这些系统调用。 5.理解文件系统 Linux提供了一个树形文件系统,需要熟悉不同的目录及其作用,理解Linux文件系统的概念是非常重要的。当你编写的C程序需要读取或写入文件时,你需要确定文件系统中的路径和文件权限。在Linux上,路径名中的所有字符都是小写字母。 总的来说,Linux下的C开发需要对操作系统的了解比较深入,因此要花费比较长的时间去了解和学习。但是一旦掌握了Linux的知识之后,在开发时会发现Linux下的工具链和命令行的终端有很多实用性,它们都有助于提高代码的效率和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南来丶北往

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值