新版jsoncpp的一些基本用法

下载:https://github.com/open-source-parsers/jsoncpp/tree/1.9.0

直接贴代码吧

#include <stdio.h>
#include <assert.h>
#include <string>
#include <algorithm>
#include <fstream>
#include <iostream>

#include "json/json.h"

using namespace std;
std::string createJson(void)
{
    std::string jsonStr;
    Json::Value root, language, mail;
    Json::StreamWriterBuilder writerBuilder;
    std::ostringstream os;

    // 设置默认无格式化的输出
    writerBuilder.settings_["indentation"] = "";

    root["Name"] = "Zhangsan";
    root["Age"] = 25;

    language[0] = "C";
    language[1] = "C++";
    root["Language"] = language;

    mail["QQ"] = "zhangsan@qq.com";
    mail["Google"] = "san.zhang@gmail.com";
    root["E-mail"] = mail;

    root["Industry"] = "IT";

    // jsonWriter是智能指针, 当jsonWriter被析构时, 它所指向的对象(内存)也被自动释放
    std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
    jsonWriter->write(root, &os);
    jsonStr = os.str();

    // 无格式化的输出
    std::cout << "Json-none:\n" << jsonStr << std::endl;
    // 格式化的输出
    std::cout << "Json-formatted:\n" << root.toStyledString() << std::endl;

    return jsonStr;
}
std::string createJsonArray(void)
{
    std::string jsonStr;
    Json::Value root, person, language, mail;
    Json::StreamWriterBuilder writerBuilder;
    std::ostringstream os;

    // 设置默认无格式化的输出
    writerBuilder.settings_["indentation"] = "";

    person["Name"] = "Zhangsan";
    person["Age"] = 25;

    language[0] = "C";
    language[1] = "C++";
    person["Language"] = language;

    mail["QQ"] = "zhangsan@qq.com";
    mail["Google"] = "san.zhang@gmail.com";
    person["E-mail"] = mail;

    person["Industry"] = "IT";

    root.append(person);

    person["Name"] = "Lisi";
    person["Age"] = 28;

    language[0] = "Chinese";
    language[1] = "English";
    person["Language"] = language;

    mail["QQ"] = "lisi@163.com";
    mail["Google"] = "si.li@gmail.com";
    person["E-mail"] = mail;

    person["Industry"] = "Finance";

    root.append(person);

    // jsonWriter是智能指针, 当jsonWriter被析构时, 它所指向的对象(内存)也被自动释放
    std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
    jsonWriter->write(root, &os);
    jsonStr = os.str();

    // 无格式化的输出
    std::cout << "Json-array-none:\n" << jsonStr << std::endl;
    // 格式化的输出
    std::cout << "Json-array-formatted:\n" << root.toStyledString() << std::endl;

    return jsonStr;
}
bool parseJsonFromString(const std::string &jsonStr)
{
    if (jsonStr.empty())
    {
        return false;
    }

    bool res;
    JSONCPP_STRING errs;
    Json::Value root, language, mail;
    Json::CharReaderBuilder readerBuilder;

    std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
    res = jsonReader->parse(jsonStr.c_str(), jsonStr.c_str()+jsonStr.length(), &root, &errs);
    if (!res || !errs.empty())
    {
        std::cout << "parseJsonFromString error! " << errs << std::endl;
        return false;
    }

    std::cout << "root.size() = " << root.size() << std::endl;

    std::cout << "Name: " << root["Name"].asString() << std::endl;
    std::cout << "Age: " << root["Age"].asInt() << std::endl;

    language = root["Language"];
    std::cout << "Language: ";
    for (int i = 0; i < language.size(); ++i)
    {
        std::cout << language[i].asString() << " ";
    }
    std::cout << std::endl;

    mail = root["E-mail"];
    std::cout << "E-mail: " << std::endl;
    std::cout << "QQ: " << mail["QQ"].asString() << std::endl;
    std::cout << "Google: " << mail["Google"].asString() << std::endl;

    std::cout << "Industry: " << root["Industry"].asString() << std::endl;

    return true;
}
bool parseJsonArrayFromString(const std::string &jsonStr)
{
    if (jsonStr.empty())
    {
        return false;
    }

    bool res;
    JSONCPP_STRING errs;
    Json::Value root, person, language, mail;
    Json::CharReaderBuilder readerBuilder;

    std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
    res = jsonReader->parse(jsonStr.c_str(), jsonStr.c_str()+jsonStr.length(), &root, &errs);
    if (!res || !errs.empty())
    {
        std::cout << "parseJsonFromString error! " << errs << std::endl;
        return false;
    }

    std::cout << "root.size() = " << root.size() << std::endl;

    for(int i = 0; i < root.size(); ++i)
    {
        person = root[i];

        std::cout << "Name: " << person["Name"].asString() << std::endl;
        std::cout << "Age: " << person["Age"].asInt() << std::endl;

        language = person["Language"];
        std::cout << "Language: ";
        for (int i = 0; i < language.size(); ++i)
        {
            std::cout << language[i].asString() << " ";
        }
        std::cout << std::endl;

        mail = person["E-mail"];
        std::cout << "E-mail: " << std::endl;
        std::cout << "QQ: " << mail["QQ"].asString() << std::endl;
        std::cout << "Google: " << mail["Google"].asString() << std::endl;

        std::cout << "Industry: " << person["Industry"].asString() << std::endl;
    }

    return true;
}
void parseJsonArrayFromFile(const char *file)
{
    std::string line, jsonStr;
    std::ifstream ifs(file);

    assert(ifs.is_open());

    while(getline(ifs, line))
    {
        jsonStr.append(line);
    }
    ifs.close();

    parseJsonArrayFromString(jsonStr);
}
void saveJsonStringToFile(const char *file, string &jsonStr)
{
    std::ofstream ofs;
    ofs.open(file);
    assert(ofs.is_open());
    ofs << jsonStr;
    ofs.close();
}
// g++ -std=c++11 -I./include -L./lib -ljsoncpp json_test.cpp
int main()
{
    std::string jsonStr;
    jsonStr = createJson();
    saveJsonStringToFile("/tmp/json-none.json", jsonStr);
    std::cout << "**********************************" << std::endl;
    parseJsonFromString(jsonStr);
    std::cout << "**********************************" << std::endl;

    std::string jsonStrArray = createJsonArray();
    saveJsonStringToFile("/tmp/json-none-array.json", jsonStrArray);
    std::cout << "**********************************" << std::endl;
    parseJsonArrayFromString(jsonStrArray);
    std::cout << "**********************************" << std::endl;

    parseJsonArrayFromFile("/tmp/json-none-array.json");

    return 0;
}

测试结果

Json-none:
{"Age":25,"E-mail":{"Google":"san.zhang@gmail.com","QQ":"zhangsan@qq.com"},"Industry":"IT","Language":["C","C++"],"Name":"Zhangsan"}
Json-formatted:
{
	"Age" : 25,
	"E-mail" : 
	{
		"Google" : "san.zhang@gmail.com",
		"QQ" : "zhangsan@qq.com"
	},
	"Industry" : "IT",
	"Language" : 
	[
		"C",
		"C++"
	],
	"Name" : "Zhangsan"
}

**********************************
root.size() = 5
Name: Zhangsan
Age: 25
Language: C C++ 
E-mail: 
QQ: zhangsan@qq.com
Google: san.zhang@gmail.com
Industry: IT
**********************************
Json-array-none:
[{"Age":25,"E-mail":{"Google":"san.zhang@gmail.com","QQ":"zhangsan@qq.com"},"Industry":"IT","Language":["C","C++"],"Name":"Zhangsan"},{"Age":28,"E-mail":{"Google":"si.li@gmail.com","QQ":"lisi@163.com"},"Industry":"Finance","Language":["Chinese","English"],"Name":"Lisi"}]
Json-array-formatted:
[
	{
		"Age" : 25,
		"E-mail" : 
		{
			"Google" : "san.zhang@gmail.com",
			"QQ" : "zhangsan@qq.com"
		},
		"Industry" : "IT",
		"Language" : 
		[
			"C",
			"C++"
		],
		"Name" : "Zhangsan"
	},
	{
		"Age" : 28,
		"E-mail" : 
		{
			"Google" : "si.li@gmail.com",
			"QQ" : "lisi@163.com"
		},
		"Industry" : "Finance",
		"Language" : 
		[
			"Chinese",
			"English"
		],
		"Name" : "Lisi"
	}
]

**********************************
root.size() = 2
Name: Zhangsan
Age: 25
Language: C C++ 
E-mail: 
QQ: zhangsan@qq.com
Google: san.zhang@gmail.com
Industry: IT
Name: Lisi
Age: 28
Language: Chinese English 
E-mail: 
QQ: lisi@163.com
Google: si.li@gmail.com
Industry: Finance
**********************************
root.size() = 2
Name: Zhangsan
Age: 25
Language: C C++ 
E-mail: 
QQ: zhangsan@qq.com
Google: san.zhang@gmail.com
Industry: IT
Name: Lisi
Age: 28
Language: Chinese English 
E-mail: 
QQ: lisi@163.com
Google: si.li@gmail.com
Industry: Finance
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cfl927096306

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

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

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

打赏作者

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

抵扣说明:

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

余额充值