首页 > 其他分享 >prb2xml go

prb2xml go

时间:2024-01-14 19:44:07浏览次数:37  
标签:const cJSON prb2xml member field child go message

之前浏览protobuf-c相关代码的时候,根据如下 

protobuf_c_message_pack protobuf_c_message_pack_to_bufferprotobuf_c_message_unpack protobuf_c_message_free_unpacked 

函数的实现,写了一个protobuf2xml、xml2protobuf  以及protobuf2json、json2protobuf的公共代码。

解决了 读取xml json到struct的问题。

目前go中有很多gorm解决了sql-db到struct映射的库以及struct到json的库。目前struct到xml的映射好像没有额!!!

pb2json 核心是:

  • 遍历pb的每一个FieldDescriptor
  • 如果是required 或者option 标签则调用cJSON_AddNumberToObject 添加json的k-v节点
cJSON_AddNumberToObject(parent, field->name, *(const int32_t*)(member));

对于message类型数据;

required_field_to_json(const ProtobufCFieldDescriptor *field,const void *member, cJSON *parent) 
{
    const ProtobufCMessage *sub_msg =*(ProtobufCMessage * const *)member;
     cJSON *child = cJSON_CreateObject();
     cJSON_AddItemToObject(parent, field->name, child);
    message_to_json(sub_msg, child)
}
  •  如果是repeated 标签;则类似于message 类型数据处理
array_child = cJSON_CreateArray();
cJSON_AddItemToObject(parent, field->name, array_child);
for (i = 0; i < count; i++) {
    cJSON_AddNumberToObject(array_child, field->name, *(const int32_t*)(array));
    array += siz;
 }

json2pb核心是:

  • scanjson;扫描json,解析每个k-v节点根据key 以及filed映射反射,member中去
  • 为repeated数据给message分配一级arry也就是char**ptr,先分配一维数组内存prt = malloc(sizeof(void *) * n_mem) 大小内存
  • 根据scan_member 结果组装message
     cJSON *child =parent->child;
    while (child!=NULL)
    {
        cJSON *child = cJSON_GetArrayItem(parent, i);
        const char *name = child->string;
        field = descriptor_get_field_by_name(desc, name);
        scanned_member.field = field;
        if (field->label != LABEL_REPEATED) {
            scanned_member.node = child;
            ret = add_member(result, &scanned_member, allocator);
        } else {
            n = message+field->quantifier_offset;
            cJSON *child_child =child->child;
            while (child_child!=NULL) {       
                scanned_member.node = child_child;
                add_member(result, &scanned_member,allocator);
                *n += 1;
                child_child = child_child->next;
            }
        }
        child =child->next;
    }

后面直接使用c-go把

标签:const,cJSON,prb2xml,member,field,child,go,message
From: https://www.cnblogs.com/codestack/p/17961872

相关文章

  • django restframework
    传送门:https://www.bilibili.com/video/BV1xj411C7ws?p=6&spm_id_from=pageDriver&vd_source=502f63a6c3f07b2d0c4afd71ff535497原始的djangorestframework......
  • client-go连接数
    单节点k8s集群v1.19.0client-go用于访问kube-apiserver,可以list/watchk8s资源。组件名称访问kube-apiserver方式单个实例的https连接数kube-scheduler本机ip2kube-controller-manager本机ip2corednsserviceclusterip1kube-......
  • 使用腾讯AIDesign的设计LOGO
         腾讯AIDesign免费开放全部功能,支持logo的智能设计、调优、VI生成、下载。推广期间,每个用户每日可免费下载10款logo及其衍生品,可下载内容包括:高清无水印的彩色logo图片、标准墨稿、标准反色稿、名片设计稿。     我们抱着试试,输入chinacreator字符,生成一些LOGO试......
  • Golang流水线设计模式实践
    Golang流水线设计模式实践原创 俞凡DeepNoMind DeepNoMind 2024-01-1411:45 发表于上海 听全文流水线设计模式对于顺序处理业务数据非常有用,可以以一致的方式直观的定义对数据的处理流程。原文: UsingaPipelinePatterninGolang[1]到目前为止,我已经将Gola......
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析
    在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样查找单个文档要从MongoDB的集合中选择数据,我们可以使用find_one()方法。find_one()方法返回选择中的第一个文档。示例查找customers集合中......
  • django练手(二十二):增加删除图片的功能
    一、功能描述缩略图下面增加图片名称和删除链接;点击删除链接发送post请求到后台,并传图片id;后台接收到id,把该id图片的is_active值置为false;刷新缩略图的div;刷新分页区域。二、功能实现修改app-models.py的avatar类,增加is_active字段,代码如下:#用户图标上传模型classAv......
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析
    在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样查找单个文档要从MongoDB的集合中选择数据,我们可以使用find_one()方法。find_one()方法返回选择中的第一个文档。示例查找customers集合......
  • go实现事件驱动器
    使用Go构建高性能的事件管理器原创 K8sCat 源自开发者 2023-12-1407:42 发表于广东 听全文事件驱动编程是一种编程范式,在这种范式下,程序的执行流由外部事件(如用户操作、传感器输出或消息传递)来决定。在Go语言中,构建一个事件管理器可以帮助我们更好地组织和处理......
  • LogoFast:轻松创建引人注目的标志
    LogoFast:创意无限,设计无忧的标志生成工具在当今数字化的时代,品牌标识对于任何企业或个人都至关重要。然而,对于缺乏专业设计技能的人来说,创建一个引人注目的标志可能是一项具有挑战性的任务。在这样的背景下,LogoFast应运而生,为用户提供了一种轻松创建引人注目的标志的创新方式。Lo......
  • Go 语言为什么不支持并发读写 map?
    大家好,我是frank,「Golang语言开发栈」公众号作者。01介绍在Go语言项目开发中,我们经常会使用哈希表map,它的时间复杂度是O(1),Go语言中的map使用开放寻址法避免哈希碰撞。Go语言中的map并非原子操作,不支持并发读写操作。Go官方认为map在大多数情况下是使用map......