最全jsoncpp操作实例

jsoncpp的安装和使用

1.jsoncpp安装

1.获取源码

https://github.com/open-source-parsers/jsoncpp
Jsoncpp

2.编译方式

  • 静态库编译
    mkdir build && cd build && cmake ..
    make
    sudo make install
    
    静态库
    在项目中新建include和lib,分别存放json头文件和libjsoncpp.a静态库
    项目
    g++编译指令
g++ *.cpp -I ./lib -ljsoncpp -o test
  • 源码调用
    直接使用json.h和jsoncpp.cpp文件在项目中编译,将jsoncpp.cpp直接放到项目根目录下一同编译
g++ *.cpp -o test

源码文件

2.jsoncpp的使用

  • jsoncpp添加,删除,修改代码实现
#include<iostream>
#include<string>
#include<fstream>
#include"json/json.h"

using namespace std;

void parserJson(const string file_path)
{
    // 打开json文件
    ifstream ifp(file_path,ios::binary);
    if(!ifp.is_open())
    {
        printf("OPEN ERROR\n");
        return;
    }
    // 调用jsoncpp API 解析json文件
    Json::Value value;
    Json::Reader reader;
    // Json流写入API
    Json::StreamWriterBuilder writerBuilder;
    std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
    if(!reader.parse(ifp,value,false))
    {
        printf("parser failed!\n");
        return;
    }
    // 打印信息
    cout<<"Json-none:\n"<<value<<endl;  // 无格式输出
    cout<<"Json-format:\n"<<value.toStyledString()<<endl;  // 带格式输出
    // isMember查看json是否存在key
    if(!value["table"])
    {
        printf("file is empty\n");
        return;
    }
    
    // 获取成员
    auto tables = value["table"];
    int table_num = value["table_num"].asInt();
    // 迭代解析table
    for(int n=0;n<tables.size();n++)
    {
        int table_id = tables[n]["table_id"].asInt();
        int ItemSize = tables[n]["ItemSize"].asInt();
        auto Items = tables[n]["item"];  // Items为二维列表结构,单独解析
        printf("Items.size = %d \n",Items.size());
        for(int i=0;i<Items.size();i++)
        {
            auto Item = Items[i];
            // 修改某一Item项,使其值均为0
            if(i==1)
            {
                for(int j=0;j<Item.size();j++)
                    Item[j]=0;
                // 导入原table流中
                tables[n]["item"][i] = Item;
            }
            // 删除某一Item项
            if(i==2)
            {
                // 创建新的Item覆盖原有Item项
                Json::Value newtable;
                for(int i=0;i<Items.size();i++)
                {
                    if(i==2)
                        continue;
                    newtable.append(tables[n]["item"][i]);
                }
                tables[n]["item"] = newtable;
            }
            // 增加Item项
            if(i==Items.size()-1)
            {
                for(int j=0;j<Item.size();j++)
                {
                    tables[n]["item"][i+1][j]=1;
                }
            }
        }
    }
    // 更新表项
    value["table"] = tables;
    // 打印信息
    cout<<"new-Json-none:\n"<<value<<endl;  // 无格式输出
    cout<<"new-Json-format:\n"<<value.toStyledString()<<endl;  // 带格式输出
    ifp.close();
    // 写入表项
    std::ofstream ofp(file_path, std::ios::out);
    jsonWriter->write(value, &ofp);

    ofp.close();

}



int main(int argc,char** argv)
{
    if(argv[1]!=NULL)
        parserJson(argv[1]);
    else
        parserJson("myTable.json");

    return 0;
}

// myTable.json如下
{
	"table" : 
	[
		{
			"ItemSize" : 8,
			"item" : 
			[
				[
					255,
					255,
					0,
					1,
					3,
					4,
					5,
					6
				],
				[
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0
				]
			],
			"table_id" : 255
		},
		{
			"ItemSize" : 24,
			"item" : 
			[
				[
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0,
					0
				]
			],
			"table_id" : 2
		}
	],
	"table_num" : 2
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值