Json11开源库使用

news/2024/7/10 22:30:24 标签: 开源, qt, c++

源码下载:GitHub - dropbox/json11: A tiny JSON library for C++11.

1.加载json11库

它用起来非常方便,只有两个文件,一个json11.hpp,一个json11.cpp。

2.代码示例
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "json11.hpp"

#ifdef _MSC_VER
#include <Windows.h>
static std::string utf8_to_gbk(const char *utf8)
{
    char gbk[256];
    const int maxlen = 256;
    wchar_t unicode_str[maxlen];
    int outlen = MultiByteToWideChar(CP_UTF8, 0, utf8, strlen(utf8), unicode_str, maxlen);
    outlen = WideCharToMultiByte(CP_ACP, 0, unicode_str, outlen, gbk, 256, NULL, NULL);
    gbk[outlen] = '\0';

    std::string str;
    str.assign(gbk);
    return str;
}
#endif

int test1();
int test2();
int test3();
int test4();

int main()
{
    test4();

    std::cout << "ok" << std::endl;
    return 0;
}

int test4()
{
    // std::istringstream
    std::filebuf in;
    if (!in.open("E:/GitCode/Messy_Test/testdata/json.data", std::ios::in))
    {
        std::cout << "fail to open file" << std::endl;
        return -1;
    }

    std::istream iss(&in);

    std::istreambuf_iterator<char> eos;
    std::string s(std::istreambuf_iterator<char>(iss), eos);
    std::string err;
    auto json = json11::Json::parse(s, err);
    if (!err.empty())
    {
        in.close();
        return -1;
    }

    std::cout << "************** show file info *****************" << std::endl;
    std::string json_str = json.dump();
    std::cout << json_str << std::endl;

    std::cout << "*************** start parse ****************" << std::endl;

    std::string name = json["name"].string_value();
    std::string addr = json["address"].string_value();
    int age = json["age"].int_value();

    json11::Json::array array_ = json["value1"].array_items();
    std::vector<std::vector<float>> value1;
    value1.resize(array_.size());
    for (int i = 0; i < array_.size(); i++)
    {
        json11::Json::array tmp = array_[i].array_items();

        value1[i].resize(tmp.size());
        for (int j = 0; j < tmp.size(); j++)
        {
            value1[i][j] = tmp[j].number_value();
        }
    }

    std::vector<float> value2;
    array_ = json["value2"].array_items();
    value2.resize(array_.size());
    for (int i = 0; i < array_.size(); i++)
    {
        value2[i] = array_[i].number_value();
    }

    std::string beijing_addr;
    bool beijing_car, beijing_cat;
    if (json["bei_jing"].is_null())
    {
        std::cout << "failed to get bei_jing info" << std::endl;
    }
    else
    {
        json11::Json::object object_ = json["bei_jing"].object_items();

        beijing_addr = object_["address"].string_value();
        beijing_car = object_["car"].bool_value();
        beijing_cat = object_["cat"].bool_value();
    }

    std::string shandong_addr, tmp_addr;
    std::vector<std::string> shandong_value1;
    if (json["shan_dong"].is_null())
    {
        std::cout << "failed to get shan_dong info" << std::endl;
    }
    else
    {
        json11::Json::object object_ = json["shan_dong"].object_items();

        tmp_addr = object_["tmp"].string_value();
        if (tmp_addr == "")
        {
            std::cout << "tmp is null" << std::endl;
        }

        shandong_addr = object_["address"].string_value();

        json11::Json::array tmp = object_["value1"].array_items();
        shandong_value1.resize(array_.size());
        json11::Json json_ = tmp[0];
        shandong_value1[0] = json_["ji_nan"].string_value();
        json_ = tmp[1];
        shandong_value1[1] = json_["tai_an"].string_value();
    }

    std::cout << "************** parse result ***************" << std::endl;
    std::cout << "name: " << utf8_to_gbk(name.c_str()) << std::endl;
    std::cout << "address: " << utf8_to_gbk(addr.c_str()) << std::endl;
    std::cout << "age: " << age << std::endl;

    std::cout << "value1: " << std::endl;
    for (int i = 0; i < value1.size(); i++)
    {
        for (int j = 0; j < value1[i].size(); j++)
        {
            std::cout << "  " << value1[i][j];
        }
        std::cout << std::endl;
    }

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

    std::cout << "bei_jing info: " << std::endl;
    std::cout << "  address: " << utf8_to_gbk(beijing_addr.c_str()) << std::endl;
    std::cout << "  car: " << beijing_car << std::endl;
    std::cout << "  cat: " << beijing_cat << std::endl;

    std::cout << "shan_dong info: " << std::endl;
    std::cout << "  address: " << utf8_to_gbk(shandong_addr.c_str()) << std::endl;
    std::cout << "  value1: " << std::endl;
    std::cout << "    ji_nan: " << utf8_to_gbk(shandong_value1[0].c_str()) << std::endl;
    std::cout << "    tai_an: " << utf8_to_gbk(shandong_value1[1].c_str()) << std::endl;

    in.close();
    return 0;
}

int test1()
{
    json11::Json my_json = json11::Json::object{
        {"中国", "北京"},
        {"key2", false},
        {"key3", json11::Json::array{1, 2, 3}},
    };
    std::string json_str = my_json.dump();
    std::string key_1 = my_json["中国"].string_value();

    std::cout << json_str << std::endl;
    std::cout << key_1 << std::endl;

    return 0;
}

int test2()
{
    class Point
    {
    public:
        int x;
        int y;
        Point(int x, int y) : x(x), y(y) {}
        json11::Json to_json() const { return json11::Json::array{x, y}; }
    };

    std::vector<Point> points = {{1, 2}, {10, 20}, {100, 200}};
    std::string points_json = json11::Json(points).dump();

    std::cout << points_json << std::endl;

    return 0;
}

int test3()
{
    json11::Json json = json11::Json::array{json11::Json::object{{"k", "v"}}};
    std::string str = json[0]["k"].string_value();

    std::cout << str << std::endl;

    return 0;
}

json文件内容如下所示:

{
    "name": "spring",
    "address": "北京",
    "age": 30,
    "value1": [
        [
            23,
            43,
            -2.3,
            6.7,
            90
        ],
        [
            -9,
            -19,
            10,
            2
        ],
        [
            -5,
            -55
        ]
    ],
    "value2": [
        13.3,
        1.9,
        2.10
    ],
    "bei_jing": {
        "address": "海淀",
        "car": false,
        "cat": true
    },
    "shan_dong": {
        "address": "济南",
        "value1": [
            {
                "ji_nan": "趵突泉"
            },
            {
                "tai_an": "泰山"
            }
        ]
    }
}


http://www.niftyadmin.cn/n/5393708.html

相关文章

云原生高级第一次作业

目录 实验需求&#xff1a; 第一个实验步骤&#xff1a; openEuler 二进制方式安装MySQL 8.0.x 1.首先需要获取软件包 2.然后安装tar和xz格式可进行解压工具 3.接下来就是安装MySQL 4.配置环境变量 5.登入并修改密码 6.停止服务脚本 7.提供配置文件 8.进入/etc/my.cnf…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

C# OpenVINO PaddleSeg实时人像抠图PP-MattingV2

目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…

LeetCode 1393.股票的资本损益

Stocks 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | stock_name | varchar | | operation | enum | | operation_day | int | | price | int | ---------------------- (stock_name, day) 是这张表的主键(具有唯一值的列的组合) …

【Qt】QTextEdit/QPlainTextEdit 实现 Ctrl + 鼠标滚轮 缩放文本功能

【Qt】QTextEdit/QPlainTextEdit 实现 Ctrl 鼠标滚轮 缩放文本功能 文章目录 I - 实现自定义控件1.1 - 原理与代码1.2 - 问题与解决 II - 完整代码III - 参考链接 I - 实现自定义控件 1.1 - 原理与代码 主要原理&#xff1a;自定义控件继承 QTextEdit 或者 QPlainTextEdit 类…

模型部署——RKNN模型量化精度分析及混合量化提高精度(附代码)

这里写目录标题 一、量化精度分析及混合量化的必要性二、源码包获取三、量化精度分析3.1 量化精度分析流程3.2 量化精度分析accuracy_analysis接口3.3 测量模拟器推理精度代码3.3.1 参数修改3.3.2 代码3.3.3 测试结果 3.4 测量开发板推理精度代码3.4.1 参数修改3.4.2 代码3.4.3…

STM32F103学习笔记(六) RTC实时时钟(应用篇)

目录 1. RTC 实时时钟的应用场景 2. RTC 的配置与初始化 2.1 设置 RTC 时钟源 2.2 初始化 RTC 寄存器 2.3 中断配置 2.4 备份寄存器配置 2.5 校准 RTC 3. 实例演示代码 4. 总结 1. RTC 实时时钟的应用场景 实时时钟&#xff08;RTC&#xff09;在嵌入式系统中具有广泛…

红黑树(RBTree)BST,的性质与操作

一、 红黑树(Red-Black Tree)是一种“自平衡”的二叉查找树(Binary Search Tree, BST)&#xff0c;由于基于二叉查找树(并不是基于 AVL 树(平衡二叉查找树))&#xff01;&#xff01;&#xff01;&#xff01; 二、 参考原文&#xff1a;理解红黑树&#xff08;RBTree&#…