开源代码学习:json11源码阅读

C++开源项目学习指南:15个精选项目与高效源码阅读路径 在C++开发中,学习优秀开源项目是提升工程能力的关键路径。通过阅读高质量源码,开发者可以深入理解现代C++特性、设计模式和性能优化等核心概念。其技术价值在于将理论知识与工程实践结合,掌握从基础库到复杂系统的架构设计原理。应用场景广泛,涵盖网络编程、并发处理、图形渲染、数据存储及系统性能优化等多个领域。本文聚焦于精选的15个C++开源项目,如spdlog和workflow,提供从项目选型到深度解析的实操指南,帮助开发者构建系统化的学习路径,有效提升代码阅读与工程实践能力。 阅读详情

本篇是《开源代码学习》的第二篇,上一篇为:《一文搞定json解析和封装问题,手把手带你学习CJSON开源代码》
本文阅读一下json11的代码,json11是使用C++11编写的json库,对json11代码或者使用感兴趣的小伙伴可以阅读一下此文。

json11

json11是json11是一个轻量级的C++11库, 提供JSON的序列化和反序列化功能.,
之前在解析json数据的时候,尝试了好几个json库,最终决定使用json11,主要有以下几个原因:

  1. json的通用功能
  2. 可以像使用C++类一样使用
  3. 中文不乱码,这是我选择这个库的主要原因

json11的github地址:json11.

json11源码阅读

项目结构

项目结构比较简单,只有俩个文件

json11.hpp
json11.cpp

ReamME

json11是一个轻量级的C++11库, 提供JSON的序列化和反序列化功能.
核心的对象是 json11::Json. 可以用来表示任意类型的JSON数据:
null, bool, number (int or double), string (std::string), array (std::vector), 或者object (std::map).

json11::Json类型的对象和其他值类型一样,支持赋值、拷贝、传递、比较等操作. 我们还提供了辅助方法

Json::dump用来将json11::Json类型的对象序列化为string Json::parse
(static)用来将std::string反序列化为json11::Json类型的对象

使用C++11提供的初始化器可以很容易创建一个json11::Json对象:

Json my_json = Json::object {
    { "key1", "value1" },
    { "key2", false },
    { "key3", Json::array { 1, 2, 3 } },
};
std::string json_str = my_json.dump();

这里还提供了一些内置的构造函数,可以将标准库类型和用户自定义类型自动的转化为json11::Json对象。例如:

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

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

Json同时支持下标和关键字索引:

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

json11设计

主要由以下几个类构成

  • class Json
  • class JsonValue
  • class Value
  • class JsonInt JsonDouble …

Json类为对外开放的接口,有多种构造方式。

class Json final { 
public
    // Types
    enum Type {
        NUL, NUMBER, BOOL, STRING, ARRAY, OBJECT
    };
    typedef std::vector<Json> array; //array、object直接使用STL容器实现
    typedef std::map<std::string, Json> object;

    Json() noexcept;                // NUL
    Json(std::nullptr_t) noexcept;  // NUL 
    Json(double value);             // NUMBER
    Json(int value);                // NUMBER
    Json(bool value);               // BOOL
    Json(const std::string &value); // STRING
    Json(std::string &&value);      // STRING
    Json(const char * value);       // STRING
    Json(const array &values);      // ARRAY
    Json(array &&values);           // ARRAY
    Json(const object &values);     // OBJECT
    Json(object &&values);          // OBJECT

    template <class T, class = decltype(&T::to_json)>
    Json(const T & t) : Json(t.to_json()) {}

    template <class M, typename std::enable_if<
        std::is_constructible<std::string, decltype(std::declval<M>().begin()->first)>::value
        && std::is_constructible<Json, decltype(std::declval<M>().begin()->second)>::value,
            int>::type = 0>
    Json(const M & m) : Json(object(m.begin(), m.end())) {}
    template <class V, typename std::enable_if<
        std::is_constructible<Json, decltype(*std::declval<V>().begin())>::value,
            int>::type = 0>
    Json(const V & v) : Json(array(v.begin(), v.end())) {}
    Json(void *) = delete;

...

private:
    std::shared_ptr<JsonValue> m_ptr;

其中有几个构造函数比较复杂,详见:

这些数据的实体被存放在m_ptr所指向的对象之中。

class JsonValue {
protected:
    friend class Json;
    friend class JsonInt;
    friend class JsonDouble;
    virtual Json::Type type() const = 0;
    virtual bool equals(const JsonValue * other) const = 0;
    virtual bool less(const JsonValue * other) const = 0;
    virtual void dump(std::string &out) const = 0;
    virtual double number_value() const;
    virtual int int_value() const;
    virtual bool bool_value() const;
    virtual const std::string &string_value() const;
    virtual const Json::array &array_items() const;
    virtual const Json &operator[](size_t i) const;
    virtual const Json::object &object_items() const;
    virtual const Json &operator[](const std::string &key) const;
    virtual ~JsonValue() {}
};

JsonValue是一个抽象基类,定义了一些api,用来操作访问json对象。这些api并不向用户开放,用于内部使用。用户借由Json类中提供的函数来操作和访问。
接下来是其派生类Value:

template <Json::Type tag, typename T>
class Value : public JsonValue {
protected:

    // Constructors
    explicit Value(const T &value) : m_value(value) {}
    explicit Value(T &&value)      : m_value(move(value)) {}

    // Get type tag
    Json::Type type() const override {
        return tag;
    }

    // Comparisons
    bool equals(const JsonValue * other) const override {
        return m_value == static_cast<const Value<tag, T> *>(other)->m_value;
    }
    bool less(const JsonValue * other) const override {
        return m_value < static_cast<const Value<tag, T> *>(other)->m_value;
    }

    const T m_value;
    void dump(string &out) const override { json11::dump(m_value, out); }
};

Value作为一个类模板,实例化出不同的类保存着json对象的数据实体。

而JsonInt,JsonDouble等等类可以直接通过继承对应的实例化类来保存数据。

以JsonInt为例:

class JsonInt final : public Value<Json::NUMBER, int> {
    double number_value() const override { return m_value; }
    int int_value() const override { return m_value; }
    bool equals(const JsonValue * other) const override { return m_value == other->number_value(); }
    bool less(const JsonValue * other)   const override { return m_value <  other->number_value(); }
public:
    explicit JsonInt(int value) : Value(value) {}
};

继承的Value为int版本,因此可以直接通过父类构造函数来保存value。同时实现了专属于该类的一些操作,例如int_value()用来获取value的值。

参考资料

https://www.cnblogs.com/cknightx/p/7717539.html

Artplayer视频JSON解析播放器源码|支持弹幕|json数据模式 Artplayer是一款开源的HTML5视频播放器,它以其简洁的界面、强大的功能和高度可定制性受到开发者和用户的喜爱。Artplayer不仅支持常见的视频格式,还通过其独特的JSON解析功能,实现了对视频数据的灵活处理,使得视频播放更加智能和个性化。Artplayer视频播放器通过其强大的JSON解析功能和对弹幕的完美支持,为用户提供了一个全新的视频观看体验。无论是开发者还是普通用户,都能从Artplayer的创新中受益。 阅读详情

相关推荐

C++开源项目贡献指南:从代码阅读到PR提交的完整路径

在软件开发领域,理解大型开源项目的架构和参与贡献是提升工程能力的关键路径。开源项目通常基于版本控制系统(如Git)进行协作,采用持续集成(CI)流程确保代码质量。其技术价值在于通过社区协作构建可靠、高效的软件,广泛应用于基础设施、框架开发等场景。对于C++开发者而言,参与如spdlog、Catch2这类高质量开源项目,不仅能深入理解现代C++特性(如模板、RAII),还能掌握CMake构建、调试器动态追踪等工程实践。本文聚焦于如何系统性地从零开始,通过筛选友好项目、搭建开发环境、阅读代码方法论,最终完成第一

weixin_33600816的博客 248

C++开源项目阅读指南:从网络编程到系统优化的学习路径

开源项目是学习现代C++编程范式和工程实践的重要途径。理解其核心原理,如事件驱动、内存管理和数据结构设计,能帮助开发者掌握高性能、高并发系统的构建方法。这些技术广泛应用于网络服务器、基础设施库和存储引擎等场景,对提升代码质量和系统性能具有重要价值。本文聚焦于网络编程、工具库和系统优化等领域的精选项目,如TinyWebServer和LevelDB,通过分析其架构设计和实现细节,为读者提供一套高效的学习方法论。

weixin_30536861的博客 319

CANOE DIVA 工程怎样在具体服务前增加前置条件

然后会在CANoe的Test Module视窗中发现一个跟系统条件相关的Test Module模块,在该模块中有生成跟系统条件相关的CAPL 脚本。这里需要根据你的实际项目进行更改,diva工程加载到canoe的工程的时候,会同步加入你创建的cdd文件,这里示例的ABS_ESP 就是你的cdd的ECU命名,后面就是具体的前置条件服务。4、配置完成后,测试用例就会如下图Trace窗口所示,在每一次10 02请求之前都会调用CAPL Function的PreconditionCheck函数中定义的脚本。

weixin_45940007的博客 1969

C++ JSON库json11的使用方法

json11的使用方法总结

zhangzl419 1585

SAP_MM&FI模块-质保金标准解决方案详解

主要讲述了SAP系统质保金的标准实现方案,包含业务背景、后台配置、前台业务操作记录,以及关键点的AI解释;

风沙的博客 687

人工智能面试总结-分类与聚类

目录说说常用的分类算法,以及各自的优缺点?说说为什么正确率有时不能有效评估分类算法?说说什么样的分类器最好?说说聚类算法有哪些衡量标准?(选看)各聚类算法性能比较汇总说说什么是聚类,你知道哪些聚类算法?具体展开介绍你知道的聚类算法?说说K-Means聚类算法流程?说说K-Means聚类算法如何调优?说说K-Means聚类算法如何选择初始点?说说K-Means聚类聚的是特征还是样本?说说K-Means聚类的特征距离是如何计算的?说说聚类与分类的区别?手撕K-Means聚类 说说常用的分类算法,以及各自的优缺点

啥都生的博客 3865

C++ json库介绍 - json11的使用

本文章主要介绍下json11库的使用json11: json11是一个轻量级的C++11库, 提供JSON的序列化和反序列化功能。使用时只需要在我们的工程中引入头文件json11.hpp和源文件json11.cpp即可使用。

new9232的博客 4380

SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行

本文是ABAP开发入门指南,详细介绍如何创建并运行第一个"Hello World"程序。主要内容包括:通过SE38事务码进入ABAP编辑器;创建以Z/Y开头的程序并保存为本地对象;编写简单的WRITE输出语句;完成语法检查、激活和执行流程;以及初步体验调试功能。文章特别强调ABAP开发的规范要求,如程序命名规则、激活与保存的区别等,并提供了详细的步骤说明和常见问题提示,帮助零基础开发者快速上手ABAP编程。

baidu_35680696的博客 481

c语言-json开源库cJSON的使用

一、cJSON的介绍 cJSON是一个开源的JSON解析器,用于解析JSON数据。它是由纯C语言实现,因此跨平台性好,移植简单。下载地址:https://github.com/DaveGamble/cJSON.git https://gitee.com/du-yueqiang/cJSON?_from=gitee_search二、移植方法 cJSON只有一个cjson.c和cjson.h...

weixin_46158019的博客 2740

Hermes接入IMA知识库全攻略:将知识库装进你的Hermes智能体

本文详细介绍了如何将IMA知识库功能接入Hermes Agent平台,实现一站式笔记管理和知识库操作。主要内容包括:获取IMA访问凭证、下载技能包、配置凭据(支持文件和环境变量两种方式)、验证配置有效性,以及实际应用演示(查询知识库列表、创建笔记并添加到知识库)。文章还提供了常见问题解决方案,如认证失败处理、版本更新等。通过该集成,用户可在Hermes中直接调用IMA的笔记创建、知识库管理等强大功能,提升工作效率。

小石头的专栏 641

Cesium圆形波纹/雷达扩散效果扩展类CircleWaveMaterialProperty

本文是基于原创内容进行部分修改,原文出处:https://blog.youkuaiyun.com/chudage11/article/details/101632482 SuperMapCesium支持该类似扩展类,以下是原生Cesium调用扩展类CircleWaveMaterialProperty说明 1.扩展类CircleWaveMaterialProperty.js import*asCesiumfrom'cesium' varCircleWaveMaterial={ Circl...

一碗老面的博客 3000

json11详细使用教程,持续更新!

json JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。 json这里就不详细介绍了,看这个链接就可 json详解 json11 json11是用C++11编写的一个第三方库,之前在解析json数据的时候,尝试了好几个json库,最终决定使用json11,主要有以下几个原因: json的通用功能 可以像使用C++类一样使用 中文不乱码,这是我选择这个库的主要原因 json11的gith

CodeBowl的博客 3037

智能车图像处理2-入门级分析1 ---基础扫线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 7762

json11 c++ 用法

1. json 生成         // 生成 json         json11::Json my_json = json11::Json::object {             { "key1", "value1" },             { "key2", false },             { "key3", json11::Json::array

yangzm的专栏 8253

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

一文搞定json解析和封装问题,手把手带你学习CJSON开源代码

cJSON保姆级教程JSON简介cJSON介绍基本使用操作关键数据结构设计思想JSON数据解析解析步骤json数据封装封装步骤封装示例使用注意事项内存及时释放内存钩子阅读心得比较巧妙的地方json的设计格式参考资料 努力成为大佬! JSON简介 JSON 全称 JavaScript Object Notation,即 JS对象简谱,是一种轻量级的数据格式。 它采用完全独立于编程语言的文本格式来存储和表示数据,语法简洁、层次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提升了网络传输效率。

CodeBowl的博客 1925

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

c++11:nlohmann::json进阶使用(一)ordered_json

nlohmann::json是非常好用的一个json开源解析库.nlohmann/json的源码是基于C++11标准写的,整个源码就是一个文件 nlohmann/json.hpp,引用非常方便。 关于nlohmann/json的基本使用官网(https://github.com/nlohmann/json)上有比较详细的介绍。这里不再赘述,本文主要是介绍在nlohmann/json的基本使用之外一些我在使用 nlohmann/json 用到的一些扩展功能和重要但不太被了解的特性。 ordered_json

10km的专栏 6250

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【开源代码阅读系列】之 cJSON

一. 各函数代码分析和介绍: static int cJSON_strcasecmp(const char *s1,const char *s2) : 不区分大小写,判断字符串s1和s2是不是相等,相等返回0,不等返回非0; static char* cJSON_strdup(const char* str) :创建内容和str一样的字符串,并返回创建后的指针; void cJSON_InitHooks(cJSON_Hooks* hooks) :这个是hook,也就是外部用户挂钩子函数,用于申请和释放

daydayup_666的博客 924

优质 C++ 开源项目推荐:轻量且极度适合阅读

记住,代码量不是衡量库价值的唯一标准。这些小库之所以有价值,是因为它们专注于一个领域,没有冗余功能,让我们能快速抓住核心思想。不要只停留在"用"这些库上,试着理解它们的设计哲学,甚至可以自己动手实现一个简化版。这样,你才能真正掌握这些技术,而不是简单地使用它们。下次当你需要实现一个功能时,不妨先想想:有没有一个精简的库能解决这个问题?如果有,花点时间读读它的源码,你会发现,这比直接使用可能更值得。

m0_73443478的博客 1044

Lector:自由开源的自托管语言阅读器,数据自己掌控

自托管是近年来备受关注的技术实践,它让用户将应用部署在自己的服务器、NAS或本地主机上,从而完全掌控数据与隐私。与云端服务不同,自托管方案往往结合开源软件(FOSS),形成一套灵活的私有化工具栈。原理上,自托管服务通过容器化技术如Docker简化部署,将应用、数据库与存储卷隔离管理,既便于迁移,也保障数据安全性。技术价值在于:用户无需依赖第三方平台,即可构建符合个人需求的学习环境。以语言阅读器为例,应用场景覆盖外语精读、外刊浏览及生词积累——在阅读界面直接查词、标记生词、同步阅读进度,所有学习数据都保存在本

weixin_34348805的博客 495

Legado开源阅读器开发实战:从零构建个性化阅读应用

你是否厌倦了商业阅读应用的广告轰炸和功能限制?想要一个完全自定义、无广告、功能强大的阅读器?Legado开源阅读器正是你需要的解决方案!这是一款基于Android平台的开源阅读应用,支持自定义书源、本地文件阅读、高度个性化的界面定制,让你完全掌控自己的阅读体验。 本文将带你深入Legado的核心价值,解决开发过程中遇到的实际挑战,并提供从环境搭建到功能扩展的完整实践方案。无论你是想二次开发定制专

gitblog_00246的博客 331

fastJson解析框架的学习

最近偶然间看到了以前写过的代码,发现了以前用的非常频繁的json解析框架fastjson。这个框架的确非常方便,帮助开发者省了很多的人工代码。以前那是因为没有时间写学习其中的原理,周末抽了点时间分析了下他的源码,可以作为不错的json解析框架的资料。主要分为2个步骤,1个是对象转json字符串,还有1个是json字符转对象的处理。 fastjson介绍 fastjson是阿里巴巴内部的json

走在前往架构师的路上 1万+

嵌入式 十个最值得阅读学习的C开源项目代码

转载地址:http://blog.youkuaiyun.com/skdkjzz/article/details/40393957 开源世界有许多优秀的开源项目,我选取其中十个最优秀的、最轻量级的C语言的项目,希望可以为C语言开发人员提供参考。 十个最值得阅读学习的C开源项目代码 1. Webbench 2. Tinyhttpd 3. cJSON 4. CMockery 5. Libev 6. Mem

qingfengtsing的专栏 8373

cereal:支持C++11的开源序列化库

cereal是一个基于c++实现的序列化工具库,用于将c++的各种数据结构序列化成二进制流进行传输,并将二进制流反序列化成原来的数据结构。相比同用途库,cereal使用简单,仅需包含头文件,运行效率尚可

小曹的博客 4173

7步精通jless:从JSON查看器新手到开源贡献者的完整指南

jless是一款专为命令行设计的JSON查看器,旨在帮助开发者轻松阅读、探索和搜索JSON数据。作为替代less、jq、cat等工具组合的高效解决方案,它通过直观的界面和强大的功能,让JSON数据处理变得前所未有的简单。无论你是刚接触命令行工具的新手,还是希望为开源社区贡献力量的开发者,本指南都将带你从零开始掌握jless的使用与开发。 [![jless logo and mascot](htt

gitblog_00597的博客 916

作为程序员,我在电脑上都装过哪些 Chrome 插件?

前言相信在座大部分从事软件开发的同学都与我一样,每天在 PC 端上使用最多的几类产品,无疑是浏览器、编辑器和命令行终端。而一旦提到浏览器,自然不免俗的要提到那个倍受诸多开...

GitHubDaily 4862
上一篇: json11详细使用教程,持续更新!
下一篇: VS2022 Preview 尝鲜版 下载教程
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值