当前位置: 首页 > 工具软件 > cJSON-plus > 使用案例 >

cplus cjson 封装

谭畅
2023-12-01

内核开发中,大多是面向对象的思想
本来想仿照内核,抽象出一个驱动加载初始化,用C++ 实现,后来发现,底层逻辑还是有点乱, 读写二级制部分,设备树部分,使用json 文本替代, 分析节点描述使用,但是这个封装,还勉强可用,传参,分析都已解决.platform gpio char dev 这个的逻辑关系还得在顺一下

#include "cJSON.h"
#include "cJSON_Utils.h"
#include <iostream>
#include <string>
#include <fstream>
#include <fcntl.h>
#include <sys/stat.h>
#include <typeinfo>

class file_attr{
public:
    const char* name;
    file_attr(const char*n):name(n){}
    int32_t size(){
        struct stat fs;
        stat(name,&fs);
        return fs.st_size;
    }
};

class json: private file_attr{
public:
    json(const char* n);
    void print();
    void find(const char* node,std::string& value);
    void find(const char* node,int& value);
    void find(const char* node,const char* subnode,std::string& value);
    void find(const char* node,const char* subnode,int& value);
    ~json();
private:
    cJSON* root;
    FILE* fp;
    char* buffer;
};

json::json(const char* n): file_attr(n){
    fp = fopen(name,"r");
    buffer = new char(this->size());
    fread(buffer,this->size(),1,fp);
    root = cJSON_Parse(buffer);
}

json::~json() {
    delete[] buffer;
    buffer = nullptr;
    cJSON_free(root);
 	  fclose(fp);
}

void json::print() {
    std::cout << buffer << std::endl;
}

void json::find(const char *node, std::string & value) {
    cJSON* ptr = cJSON_GetObjectItem(root,node);
    if(ptr != nullptr){
       value = std::string(ptr->valuestring);
    }
}

void json::find(const char *node, int & value) {
    cJSON* ptr = cJSON_GetObjectItem(root,node);
    if(ptr != nullptr){
        value = ptr->valueint;
    }
}

void json::find(const char *node, const char *subnode, std::string &value) {
    cJSON* ptr = cJSON_GetObjectItem(root,node);
    if(ptr != nullptr) {
        cJSON *sub_ptr = cJSON_GetObjectItem(ptr, subnode);
        if(sub_ptr != nullptr)
            value = std::string(sub_ptr->valuestring);
    }
}

void json::find(const char *node, const char *subnode, int &value) {
    cJSON* ptr = cJSON_GetObjectItem(root,node);
    if(ptr != nullptr) {
        cJSON *sub_ptr = cJSON_GetObjectItem(ptr, subnode);
        if(sub_ptr != nullptr)
            value = sub_ptr->valueint;
    }
}
 类似资料: