首页 > 后端开发 > C++ > 正文

c++怎么实现一个简单的JSON解析器_c++手写轻量级JSON解析实现

下次还敢
发布: 2025-10-22 20:58:02
原创
627人浏览过
答案是实现C++ JSON解析器需定义Value类表示六种类型,通过Parser类逐字符解析,支持null、bool、number、string、array、object,递归处理结构并管理内存。

c++怎么实现一个简单的json解析器_c++手写轻量级json解析实现

实现一个简单的C++ JSON解析器,核心是理解JSON的结构并递归处理不同类型的数据。JSON支持的对象类型包括:null、boolean、number、string、array 和 object。我们通过构建一个通用的Value类来表示这些类型,并编写解析函数逐字符分析输入字符串。

1. 定义数据结构 Value

我们需要一个能表示多种JSON类型的联合体。使用C++的unionvariant(C++17)更合适,但为了简单兼容性,这里用类继承或枚举+联合方式。

定义一个Value类:

  • 用枚举标记类型(如 NULL_T, BOOL_T, NUMBER_T, STRING_T, ARRAY_T, OBJECT_T)
  • 用union存储实际数据(注意string需要单独new/delete)
  • 管理内存生命周期,避免泄漏

// 示例简化的Value结构

立即学习C++免费学习笔记(深入)”;

enum ValueType {
    NULL_T,
    BOOL_T,
    NUMBER_T,
    STRING_T,
    ARRAY_T,
    OBJECT_T
};
<p>class Value {
public:
ValueType type;
double number;         // number类型
bool boolean;          // bool类型
std::string<em> str;      // string类型(指针便于管理)
std::vector<Value></em> arr;   // array
std::map<std::string, Value>* obj; // object</p><pre class='brush:php;toolbar:false;'>Value() : type(NULL_T), str(nullptr), arr(nullptr), obj(nullptr) {}
~Value() { clear(); }

void clear() {
    if (str) delete str;
    if (arr) delete arr;
    if (obj) delete obj;
}
登录后复制

};

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online30
查看详情 Find JSON Path Online

2. 实现基础解析函数

从最简单的值开始解析:null、true、false、数字、字符串、数组、对象。

写一个Parser类,持有当前字符串和位置索引:

class Parser {
    std::string& json;
    size_t pos;
<pre class='brush:php;toolbar:false;'>char current() { return pos < json.size() ? json[pos] : ''; }
void skip_whitespace() {
    while (current() == ' ' || current() == '	' || current() == '
') pos++;
}
登录后复制

};

然后依次实现各类型的解析函数:

  • parse_value():根据当前字符分发到具体类型
  • parse_string():处理双引号包裹的字符串,支持转义符如" \ / 
  • parse_number():读取整数或浮点数,可用std::stod
  • parse_array():遇到[后循环解析元素,直到]
  • parse_object():遇到{后解析"key":value对

// parse_value 示例

Value parse_value() {
    skip_whitespace();
    Value v;
    switch (current()) {
        case 'n': v = parse_null(); break;
        case 't': v = parse_true(); break;
        case 'f': v = parse_false(); break;
        case '"': v = parse_string(); break;
        case '[': v = parse_array(); break;
        case '{': v = parse_object(); break;
        default: v = parse_number(); break;
    }
    return v;
}
登录后复制

3. 处理字符串与转义字符

JSON字符串中的反斜杠需要特殊处理:

  • 读取"之间的内容
  • 遇到时判断下一个字符是什么
  • 例如\ → ," → ", → 换行等
Value parse_string() {
    Value v;
    v.type = STRING_T;
    v.str = new std::string();
    pos++; // skip "
    while (current() != '"' && pos < json.size()) {
        char c = current();
        if (c == '\') {
            pos++;
            c = current();
            switch (c) {
                case '"': v.str->push_back('"'); break;
                case '\': v.str->push_back('\'); break;
                case '/': v.str->push_back('/'); break;
                case 'b': v.str->push_back(''); break;
                case 'f': v.str->push_back(''); break;
                case 'n': v.str->push_back('
'); break;
                case 'r': v.str->push_back('
'); break;
                case 't': v.str->push_back('	'); break;
                default: v.str->push_back(c); break; // 其他保留
            }
        } else {
            v.str->push_back(c);
        }
        pos++;
    }
    pos++; // skip closing "
    return v;
}
登录后复制

4. 构建入口函数与测试

提供一个接口函数,接收JSON字符串并返回解析后的Value:

Value parse(std::string& json_str) {
    Parser parser(json_str);
    return parser.parse_value();
}
登录后复制

测试示例:

int main() {
    std::string s = R"({"name": "Tom", "age": 25, "hobbies": ["coding", "reading"]})";
    Value val = parse(s);
    // 可以添加打印函数输出结果验证
    return 0;
}
登录后复制

基本上就这些。这个轻量级解析器不追求性能极致,但足够学习语法分析流程。后续可扩展错误提示、格式化输出、更高效的内存管理等功能。

以上就是c++++怎么实现一个简单的JSON解析器_c++手写轻量级JSON解析实现的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号