Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >OpenJson是世界上最易用的高性能C++json解析器

OpenJson是世界上最易用的高性能C++json解析器

原创
作者头像
linyouhappy
修改于 2023-07-20 09:34:29
修改于 2023-07-20 09:34:29
5800
举报
文章被收录于专栏:OpenLinyouOpenLinyou

openjson

跨平台多线程设计

OpenJson是最好用的高性能C++json解析器,非常简单易用,解析速度超快,可以解析超过1GB以上的json文件。

https://github.com/OpenMiniServer

运行环境

Windows、linux、Mac、iOSAndroid等跨平台设计

编译和运行

请安装cmake工具,用cmake可以构建出VS或者XCode工程,就可以在vs或者xcode上编译运行。

源代码:https://github.com/OpenMiniServer/openjson

代码语言:txt
AI代码解释
复制
git clone https://github.com/OpenMiniServer/openjson
cd ./openjson
mkdir build
cd build
cmake ..
#如果是win32,在该目录出现openjson.sln,点击它就可以启动vs写代码调试
make
./test

全部源文件

  • src/openjson.h
  • src/openjson.cpp

测试例子

代码语言:C++
AI代码解释
复制
#include "openjson.h"
#include <iostream>
#include <assert.h>
int main()
{
    std::string buff1;
    //生成json字符串
    {
        OpenJson json;
        auto& nodeA = json["a"];
        nodeA["aa"] = "aa12";
        nodeA["ab"] = 123;
        auto& nodeB = json["b"];
        //迭代数组原生
        for (size_t i = 0; i < 2; i++)
        {
            auto& node = nodeB[i];
            if (i == 0)
            {
                node["ba"]["key1"] = std::string("value_ba");
            }
            else
            {
                uint64_t val  = 999999999999999;
                node["bb"][0] = val;
                node["bb"][1] = 1.3;
            }
        }
        //设置值
        json["b"][1]["bb"][2] = true;
        buff1 = json.encode();
    }
    std::string buff2 = "{"
        "\"a\":{"
            "\"aa\":\"aa12\","
            "\"ab\":123"
        "},"
        "\"b\":["
            "{\"ba\":{\"key1\":\"value_ba\"}},"
            "{\"bb\":[999999999999999,1.3,true]}"
        "]}";

    assert(buff1 == buff2);
    //解析json字符串
    {
        OpenJson json;
        json.decode(buff2);
        auto& nodeA = json["a"];
        assert(nodeA["aa"].s() == "aa12");
        assert(nodeA["ab"].i32() == 123);
        auto& nodeB = json["b"];
        for (size_t i = 0; i < nodeB.size(); i++)
        {
            auto& node = nodeB[i];
            if (i == 0)
            {
                assert(node["ba"]["key1"].s() == "value_ba");
            }
            else
            {
                assert(node["bb"][0].i64() == 999999999999999);
                assert(node["bb"][1].d() == 1.3);
            }
        }
        assert(json["b"][1]["bb"][2].b() == true);
        //删除元素
        json["b"][1]["bb"].remove(1);
        json.encodeFile("./test.json");
    }
    buff2 = "{"
        "\"a\":{"
        "\"aa\":\"aa12\","
        "\"ab\":123"
        "},"
        "\"b\":["
        "{\"ba\":{\"key1\":\"value_ba\"}},"
        "{\"bb\":[999999999999999,true]}"
        "]}";
    {
        //加载json文件
        OpenJson json;
        json.decodeFile("./test.json");
        buff1 = json.encode();
        assert(buff1 == buff2);
    }
    buff2 = "{\"b\":[{\"bb\":[99999]}]}";
    {
        OpenJson json;
        json["b"][1]["bb"][2] = 99999;
        buff1 = json.encode();
        assert(buff1 == buff2);
    }

    {
        OpenJson json1;
        json1["a"] = "[\"abc\"]";
        buff2 = json1.encode();

        buff1 = "{\"a\":\"[\\\"abc\\\"]\"}";
        assert(buff2 == buff1);

        OpenJson json2;
        json2.decode(buff2);
        assert(buff2 == json2.encode());
    }
    std::cout << "公众号:https://mp.weixin.qq.com/s/doD_JNm3rNBqQIOrscOnqw" << std::endl;
    return 0;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenMiniServer是一个超迷你、 超易用的C++高并发跨平台服务器框架
OpenMiniServer是一个超迷你、 超易用的C++高并发跨平台服务器框架。它基于Actor模型,提供了高性能的服务器功能,支持高并发和跨平台。
linyouhappy
2023/07/20
6501
OpenSocket是跨全平台的高性能高并发网络库
Linux和安卓用epoll,Win32用IOCP,iOS和Mac用kqueue,其他系统使用select。
linyouhappy
2023/03/05
1.1K0
OpenSocket是跨全平台的高性能高并发网络库
深入 Go 中各个高性能 JSON 解析库
其实本来我是没打算去看 JSON 库的性能问题的,但是最近我对我的项目做了一次 pprof,从下面的火焰图中可以发现在业务逻辑处理中,有一半多的性能消耗都是在 JSON 解析过程中,所以就有了这篇文章。
luozhiyun
2021/05/22
4.5K0
[源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (2)
在这篇文章中,我们介绍了 HugeCTR,这是一个面向行业的推荐系统训练框架,针对具有模型并行嵌入和数据并行密集网络的大规模 CTR 模型进行了优化。
罗西的思考
2022/05/09
1.3K0
[源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (2)
如何使用“LoRa”的方式加载ONNX模型:StableDiffusion相关模型 的C++推理
1.基于 onnxruntime,将 StableDiffusionInpaintPipeline、StableDiffusionControlNetImg2ImgPipeline(stablediffusion + controlnet + LoRa) C++工程化;
BBuf
2024/07/01
7840
如何使用“LoRa”的方式加载ONNX模型:StableDiffusion相关模型 的C++推理
C++实现对16进制字符串和字节数组的tea加密和解密算法
TEA(Tiny Encryption Algorithm) 是一种简单高效的加密算法,以加密解密速度快,实现简单著称。算法真的很简单,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮。 TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 下面是维基百科中个关于该算法的C语言描述的代码片段,如下:
ccf19881030
2020/01/13
2K0
C++实现对16进制字符串和字节数组的tea加密和解密算法
​【刘文彬】 EOS行为核心:解析插件chain_plugin
原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/chainPlugin.html
圆方圆学院
2018/12/07
1.1K0
Android-json解析(三):原生JSONObject+JSONArray的解析、遍历及生成等
Android-Gson+GsonFormat的导入 Android-json解析(一):Gson的使用 Android-json解析(二):Jackson的使用 Android-json解析(三):原生JSONObject+JSONArray的使用 Android-json解析(四):fastjson的使用
全栈程序员站长
2022/09/14
8.3K0
2.8k stars 推荐一个开源功能丰富且易用的Java工具库
Hutool它是一个 Java 工具集类库,包含了很多静态方法的封装:流处理、时间日期处理、正则处理、加解密处理、文件处理、集合处理等,可以说是项目中几乎所有 XxxxUtil 的替代品,它可以使你更多的关注代码逻辑,优雅的写出高效代码,避免 “复制粘贴,改改再战”
苦叶子
2024/03/29
2030
2.8k stars 推荐一个开源功能丰富且易用的Java工具库
[源码解析] 机器学习参数服务器ps-lite (1) ----- PostOffice
参数服务器是机器学习训练一种范式,是为了解决分布式机器学习问题的一个编程框架,其主要包括服务器端,客户端和调度器,与其他范式相比,参数服务器把模型参数存储和更新提升为主要组件,并且使用多种方法提高了处理能力。
罗西的思考
2021/08/06
1.1K0
[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
在本系列中,我们介绍了 HugeCTR,这是一个面向行业的推荐系统训练框架,针对具有模型并行嵌入和数据并行密集网络的大规模 CTR 模型进行了优化。
落寞的鱼丶
2022/02/22
7900
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
但是到了c++11实现了可以用{}对容器进行一些初始化等,比如push/inset多参数构造的对象时,{}初始化会很⽅便,这是因为每个类型它都会有个initializer_list的一个构造,这样就方便了我们操作。
羑悻的小杀马特.
2025/01/23
420
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
[源码解析] 机器学习参数服务器 Paracel (1)-----总体架构
Paracel是豆瓣开发的一个分布式计算框架,它基于参数服务器范式来解决机器学习的问题:逻辑回归、SVD、矩阵分解(BFGS,sgd,als,cg),LDA,Lasso...。
罗西的思考
2021/08/12
1.1K0
Redis Lua脚本的使用
Lua语言提供了如下几种数据类型:booleans(布尔)、numbers(数值)、strings(字符串)、tables(表格)。
三产
2021/01/12
1.7K0
【Chromium】如何提取Chromium的Base库(下)
本篇文章主要记录如何从Chromium中提取Base库,方便后续的学习和使用,同时抛砖引玉,希望带给各位一些启发和帮助。
lealc
2024/04/17
4250
【Chromium】如何提取Chromium的Base库(下)
Dest0g3 520迎新赛
Dest0g3{e2d37eeb-bd8b-48d9-8444-75936cc51cb6}
故里[TRUE]
2023/04/19
8880
Dest0g3 520迎新赛
3.模块Ⅱ
常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
changxin7
2019/09/10
1.2K0
3.模块Ⅱ
[源码解析] NVIDIA HugeCTR,GPU 版本参数服务器---(8) ---Distributed Hash之后向传播
在这个系列中,我们介绍了 HugeCTR,这是一个面向行业的推荐系统训练框架,针对具有模型并行嵌入和数据并行密集网络的大规模 CTR 模型进行了优化。本文介绍 DistributedSlotSparseEmbeddingHash 的后向操作。
罗西的思考
2022/05/09
9890
[源码解析] NVIDIA HugeCTR,GPU 版本参数服务器---(8) ---Distributed Hash之后向传播
前端经典面试题(60道前端面试题包含JS、CSS、React、网络、浏览器、程序题等)
原文地址:https://mp.weixin.qq.com/s/PTSaytcf3xgOp6C9l3Pvjw
前端迷
2021/06/24
1.1K0
金钱难寐,大盗独行——以太坊 JSON-RPC 接口多种盗币手法大揭秘
2010年,Laszlo 使用 10000 个比特币购买了两张价值25美元的披萨被认为是比特币在现实世界中的第一笔交易。
Seebug漏洞平台
2018/08/16
1.3K0
金钱难寐,大盗独行——以太坊 JSON-RPC 接口多种盗币手法大揭秘
推荐阅读
相关推荐
OpenMiniServer是一个超迷你、 超易用的C++高并发跨平台服务器框架
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档