使用boost库完成读写JSON字符串

boost库的编译不做赘述,这里用的版本是1.69.0,其他版本应该差不多

boost官网:https://www.boost.org/

0.前言

今天要整的JSON是这样的

{
    "description": "this is a JSON test",
    "version": "100",
    "list": {
        "listkey1": "listvalue1",
        "listkey2": "listvalue2",
        "listkey3": "listvalue3"
    },
    "words": [
        "apple",
        "banana",
        "cat"
    ]
}

首先先新建一个vs的工程,设置include路径和lib路径

额外添加的lib为\boost\1.69.0\stage64\lib\libboost_system-vc141-mt-gd-x64-1_69.lib

在头文件中添加

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

使用ptree来完成JSON的读写操作

1、写JSON字符串

1.0、如何将ptree转换成字符串输出到屏幕

使用stringstream

    std::stringstream ss;
    boost::property_tree::write_json(ss, pt);
    std::string strContent = ss.str();    

1.1、添加简单值

   //    root
    boost::property_tree::ptree root;

    //    add simple value
    root.put(std::string("description"), std::string("this is a JSON test"));
    root.put(std::string("version"), 100);

1.2、添加一组对象

    //    add a list of objs
    boost::property_tree::ptree ptObjs;
    ptObjs.put(std::string("listkey1"), std::string("listvalue1"));
    ptObjs.put(std::string("listkey2"), std::string("listvalue2"));
    ptObjs.put(std::string("listkey3"), std::string("listvalue3"));
    root.add_child(std::string("list"), ptObjs);

1.3、添加一组值

    //    add a list of values
    boost::property_tree::ptree ptValItem1, ptValItem2, ptValItem3, ptVals;
    ptValItem1.put_value(std::string("apple"));
    ptVals.push_back(std::make_pair("", ptValItem1));
    ptValItem2.put_value(std::string("banana"));
    ptVals.push_back(std::make_pair("", ptValItem2));
    ptValItem3.put_value(std::string("cat"));
    ptVals.push_back(std::make_pair("", ptValItem3));
    root.add_child(std::string("words"), ptVals);

1.4、输出到屏幕

先通过1.0写一个输出的function

void ptreePrint(boost::property_tree::ptree pt, std::string ptName, std::string descritpion)
{
    std::stringstream ss;
    boost::property_tree::write_json(ss, pt);
    std::string strContent = ss.str();

    std::cout << descritpion << std::endl << ptName << " : " << strContent << std::endl << "--------------------------------------\n";
}

然后将每步产生的ptree输出

2.读JSON字符串

2.1 读简单值

    //    read simple value
    std::string description = pt.get<std::string>("description");
    int version = pt.get<int>("version");

2.2 读一组对象

    //    read list of objs
    std::cout << std::endl << "read list of objs " << std::endl;

    for (auto ptItem : pt.get_child("list"))
    {
        std::string key = ptItem.first;
        std::string val = ptItem.second.data();

        std::cout << "key:\t" << key << "\tvalue:\t" << val << std::endl;
    }

2.3 读一组值

    //    read list of values
    std::cout << std::endl << "read list of values" << std::endl << "words: ";
    for (auto ptItem : pt.get_child("words"))
    {
        std::cout << ptItem.second.data() << " ";
    }

2.4 输出到屏幕

3.完整代码

#include "pch.h"
#include <iostream>

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

void readTest(boost::property_tree::ptree pt)
{
    std::cout << __func__ << std::endl;

    //    read simple value
    std::string description = pt.get<std::string>("description");
    int version = pt.get<int>("version");

    std::cout << "description : " << description << std::endl << "version : " << version << std::endl;

    //    read list of objs
    std::cout << std::endl << "read list of objs " << std::endl;

    for (auto ptItem : pt.get_child("list"))
    {
        std::string key = ptItem.first;
        std::string val = ptItem.second.data();

        std::cout << "key:\t" << key << "\tvalue:\t" << val << std::endl;
    }

    //    read list of values
    std::cout << std::endl << "read list of values" << std::endl << "words: ";
    for (auto ptItem : pt.get_child("words"))
    {
        std::cout << ptItem.second.data() << " ";
    }
}

void ptreePrint(boost::property_tree::ptree pt, std::string ptName, std::string descritpion)
{
    std::stringstream ss;
    boost::property_tree::write_json(ss, pt);
    std::string strContent = ss.str();

    std::cout << descritpion << std::endl << ptName << " : " << strContent << std::endl << "--------------------------------------\n";
}

void JSONtest()
{
    //    root
    boost::property_tree::ptree root;

    //    add simple value
    root.put(std::string("description"), std::string("this is a JSON test"));
    root.put(std::string("version"), 100);

    ptreePrint(root, std::string("root"), "add simple value");

    //    add a list of objs
    boost::property_tree::ptree ptObjs;
    ptObjs.put(std::string("listkey1"), std::string("listvalue1"));
    ptObjs.put(std::string("listkey2"), std::string("listvalue2"));
    ptObjs.put(std::string("listkey3"), std::string("listvalue3"));
    root.add_child(std::string("list"), ptObjs);

    ptreePrint(root, std::string("root"), "add a list of objs");

    //    add a list of values
    boost::property_tree::ptree ptValItem1, ptValItem2, ptValItem3, ptVals;
    ptValItem1.put_value(std::string("apple"));
    ptVals.push_back(std::make_pair("", ptValItem1));
    ptValItem2.put_value(std::string("banana"));
    ptVals.push_back(std::make_pair("", ptValItem2));
    ptValItem3.put_value(std::string("cat"));
    ptVals.push_back(std::make_pair("", ptValItem3));
    root.add_child(std::string("words"), ptVals);
    ptreePrint(ptVals, std::string("ptVals"), "");
    ptreePrint(root, std::string("root"), "add a list of values");

    readTest(root);

}

int main()
{
    JSONtest();

}

原文地址:https://www.cnblogs.com/Sseakompp/p/12205793.html

时间: 2024-08-02 22:12:08

使用boost库完成读写JSON字符串的相关文章

基于开源库jsoncpp的json字符串解析

json(JavaScript Object Notation)是一种轻量级高效数据交换格式.相比于XML,其更加简洁,解析更加方便.在实习期间,我负责的程序模块,多次使用到json进行数据传输.由于之前只对json稍稍了解,而且不熟悉项目组使用的开源json解析库,故在编码过程中效率很低,而且还出现过bug.虽然,最后项目组的事情比较顺利的完成了,但感觉自己对json的编解码熟悉仍然不够,故翻阅了相关文档,写下这篇技术博客.与君共勉. 1.什么是json JSON(JavaScript Obj

第三方库 jsoncpp 读写json

一.摘要 JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记 Javascript 对象的,JSON 官方的解释为:JSON 是一种轻量级的数据传输格式. 本文并不详细介绍 JSON 本身的细节,旨在讨论如何使用 C++ 语言来处理 JSON.关于 JSON 更具体的信息,可参见 JSON 官网:http://www.json.org. 二.本文选择处理 JSON的 C++ 库 本文选择一个第三方库 jsoncpp 来解析 JSON.json

也谈C#之Json,从Json字符串到类代码

原文:也谈C#之Json,从Json字符串到类代码  阅读目录 json转类对象 逆思考 从json字符串自动生成C#类  json转类对象 自从.net 4.0开始,微软提供了一整套的针对json进行处理的方案.其中,就有如何把json字符串转化成C#类对象,其实这段代码很多人都清楚,大家也都认识,我就不多说,先贴代码. 1.添加引用 System.Web.Extensions 2.测试一下代码 1 static class Program 2 { 3 /// <summary> 4 ///

C#之Json,从Json字符串到类代码

自从.net 4.0开始,微软提供了一整套的针对json进行处理的方案.其中,就有如何把json字符串转化成C#类对象,其实这段代码很多人都清楚,大家也都认识,我就不多说,先贴代码. 1.添加引用 System.Web.Extensions 2.测试一下代码 static class Program { /// <summary> /// 程序的主入口点. /// </summary> static void Main() { string jsonStr = "{\&q

(三)Boost库之字符串处理

(三)Boost库之字符串处理 字符串处理一直是c/c++的弱项,string_algo库很好的弥补了这一点. string_algo 库算法命名规则: 前缀i    : 有这个前缀表名算法的大小写不敏感,否则大小写敏感 后缀_copy:  有这个后缀表明算法不变动输入,返回处理结果的拷贝,否则算法原地处理 后缀_if  :  有这个后缀表明算法需要一个作为判断式的谓词函数对象,否则使用默认的判断准则 string_algo库提供的算法共分五大类,如下: [1]大小写转换: [2]判断式与分类:

(二)boost库之字符串格式化

(二)boost库之字符串格式化 程序中经常需要用到字符串格式化,就个人而言还是比较倾向于C格式的输出,如果只是打印日志,printf就够了,如果到生成字符串,获取你可以选择sprintf,但这些都是需要你预先分配空间的,对于一些不可预知长度的字符串格式化,就比较鸡肋了,不过还是可以实现的,如: void XString::format(const char *strFmt, ...) { va_list vl; va_start(vl, strFmt); int count = _vscpri

[C/C++标准库]_[读写中文路径的文件--写入unicode字符串]

场景: 1. 需要写入非ascii文本并且与本地编码无关时,除了utf8,unicode编码是另外一个选择,它的好处是占两个字节,便于统计字符和对字符进行处理,因为有对应的宽字节的函数,如wcslen. 2.需要注意的亮点,要先写入0xff,0xfe文件头,之后使用fwprintf时用%S(大写)格式写入宽字节字符串. 3.使用_wfopen支持中文路径. 代码1: #include <stdio.h> #include <stdint.h> #include <stdlib

(九)boost库之文件处理filesystem

(九)boost库之文件处理filesystem filesystem库是一个可移植的文件系统操作库,它在底层做了大量的工作,使用POSIX标准表示文件系统的路径,使C++具有了类似脚本语言的功能,可以跨平台操作目录.文件,写出通用的脚本程序. 1.path的构造函数可以接受C字符串和string,也可以是一个指定首末迭代器字符串序列区间. 2.filesystem提供了一系列的文件名(或目录)检查函数. 3.有丰富的函数用于获取文件名.目录名.判断文件属性等等. 4.filesystem库使用

iOS 如何用JSONKit读写JSON文件

如何用JSONKit读写JSON文件 分类: ios2013-04-20 12:46 510人阅读 评论(0) 收藏 举报 JSON文件格式简单,使用方便,值得一用. 目前已经有多个库支持Json文件的解析,在这之中,JSONkit用起来方便,而且效率比较高,本文介绍的就是JSONKit的使用方法. 1.准备工作 下载JSONKit包:http://download.csdn.net/detail/enuola/4523160 2.写json文件 创建文件 //创建文件目录以及文件,需要用到fi