cJSON 的简单应用——保存/解析 Shader 参数 【代码示例】

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: cJSON 的简单应用——保存/解析 Shader 参数 【代码示例】

自定义的 Shader 程序结构体:

struct ShaderProgram
{
    struct Path
    {
        char *vertex_shader_path;
        char *fragment_shader_path;
    } path;
    struct FragmentShaderUniformLocation
    {
        char *channel_0;
        char *channel_1;
        char *global_time;
        char *resolution;
    } fsul;
};

入口函数:

int main()
{
#ifdef TOFILE
  createObjects();
#else
    parseFile("result.txt");
#endif
    return 0;
}

创建 (Shader Program) JSON 对象并保存为 txt 的函数:

void createObjects()
{
#if MUL
  ShaderProgram sp[2] =
  {
    {
      { "../Shader/vs_0.glsl", "../Shader/fs_0.glsl" },
      { "iChannel0", "iChannel1", "iGlobalTime", "iResolution" }
    },  // sp[0]
    {
      { "../Shader/vs_1.glsl", "../Shader/fs_1.glsl" },
      { "iChannel0", "iChannel1", "iGlobalTime", "iResolution" }
    } // sp[1]
  };
#else
  ShaderProgram sp =
  {
    { "../Shader/vs_0.glsl", "../Shader/fs_0.glsl" },
    { "iChannel0", "iChannel1", "iGlobalTime", "iResolution" }
  };
#endif
  cJSON *root = cJSON_CreateArray();
  cJSON *fld = NULL, *fldd_0 = NULL, *fldd_1;
#if MUL
  for (int i = 0; i < 2; i++)
  {
    cJSON_AddItemToArray(root, fld = cJSON_CreateArray());
    cJSON_AddItemToArray(fld, fldd_0 = cJSON_CreateObject());
    cJSON_AddStringToObject(fldd_0, "Vertex Shader Path", sp[i].path.vertex_shader_path);
    cJSON_AddStringToObject(fldd_0, "Fragment Shader Path", sp[i].path.fragment_shader_path);
    cJSON_AddItemToArray(fld, fldd_1 = cJSON_CreateObject());
    cJSON_AddStringToObject(fldd_1, "Channel 0", sp[i].fsul.channel_0);
    cJSON_AddStringToObject(fldd_1, "Channel 1", sp[i].fsul.channel_1);
    cJSON_AddStringToObject(fldd_1, "Global Time", sp[i].fsul.global_time);
    cJSON_AddStringToObject(fldd_1, "Resolution", sp[i].fsul.resolution);
  }
#else
  cJSON_AddItemToArray(root, fld = cJSON_CreateArray());
  cJSON_AddItemToArray(fld, fldd_0 = cJSON_CreateObject());
  cJSON_AddStringToObject(fldd_0, "Vertex Shader Path", sp.path.vertex_shader_path);
  cJSON_AddStringToObject(fldd_0, "Fragment Shader Path", sp.path.fragment_shader_path);
  cJSON_AddItemToArray(fld, fldd_1 = cJSON_CreateObject());
  cJSON_AddStringToObject(fldd_1, "Channel 0", sp.fsul.channel_0);
  cJSON_AddStringToObject(fldd_1, "Channel 1", sp.fsul.channel_1);
  cJSON_AddStringToObject(fldd_1, "Global Time", sp.fsul.global_time);
  cJSON_AddStringToObject(fldd_1, "Resolution", sp.fsul.resolution);
#endif
  char *out = cJSON_Print(root);
  // 保存信息到文件
  writeToFile("result.txt", out);
  printf("Debug Info: %s", out);
  free(out);
  cJSON_Delete(root);
}

解析本地 txt 的函数:

void parseFile(char *filename)
{
    FILE *f;
    long len;
    char *data;
    f = fopen(filename, "rb");
    fseek(f, 0, SEEK_END);
    len = ftell(f);
    fseek(f, 0, SEEK_SET);
    data = (char *)malloc(len + 1);
    fread(data, 1, len, f);
    fclose(f);
    //easyParse(data);
    itemParse(data);
    free(data);
}
void itemParse(char *text)
{
    cJSON *json;
    json = cJSON_Parse(text);
    if (!json)
    {
        printf("Error before: [%s]\n", cJSON_GetErrorPtr());
    }
    else
    {
        int size_0 = cJSON_GetArraySize(json);
        printf("Shader Program Nums = %d\n", size_0);
        for (int i = 0; i < size_0; i++)
        {
            cJSON *pItem = cJSON_GetArrayItem(json, i);
            if (NULL == pItem)
            {
                continue;
            }
            int size_1 = cJSON_GetArraySize(pItem);
            //printf("Shader Program Item Nums = %d\n", size_1);
            printf("===========================\n");
            for (int j = 0; j < size_1; j++)
            {
                cJSON *ppItem = cJSON_GetArrayItem(pItem, j);
                //printJSON(ppItem);
                int size_2 = cJSON_GetArraySize(ppItem);
                printf("Shader Program Item Size  = %d\n", size_2);
                //printf("---------------------------\n");
                for (int k = 0; k < size_2; k++)
                {
                    cJSON *pppItem = cJSON_GetArrayItem(ppItem, k);
                    printJSON(pppItem);
                }
                printf("===========================\n");
            }
        }
    }
    cJSON_Delete(json);
}

生成的 txt 内容为:

开启 MUL 宏的情况[

   [

       {

           "Vertex Shader Path": "../Shader/vs_0.glsl",

           "Fragment Shader Path": "../Shader/fs_0.glsl"

       },

       {

           "Channel 0": "iChannel0",

           "Channel 1": "iChannel1",

           "Global Time": "iGlobalTime",

           "Resolution": "iResolution"

       }

   ],

   [

       {

           "Vertex Shader Path": "../Shader/vs_1.glsl",

           "Fragment Shader Path": "../Shader/fs_1.glsl"

       },

       {

           "Channel 0": "iChannel0",

           "Channel 1": "iChannel1",

           "Global Time": "iGlobalTime",

           "Resolution": "iResolution"

       }

   ]

]

或未开启 MUL 的情况[

   [

       {

           "Vertex Shader Path": "../Shader/vs_0.glsl",

           "Fragment Shader Path": "../Shader/fs_0.glsl"

       },

       {

           "Channel 0": "iChannel0",

           "Channel 1": "iChannel1",

           "Global Time": "iGlobalTime",

           "Resolution": "iResolution"

       }

   ]

]

相关阅读

使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解

 

目录
相关文章
RS-485网络中的标准端接与交流电端接应用解析
RS-485,作为一种广泛应用的差分信号传输标准,因其传输距离远、抗干扰能力强、支持多点通讯等优点,在工业自动化、智能建筑、交通运输等领域得到了广泛应用。在构建RS-485网络时,端接技术扮演着至关重要的角色,它直接影响到网络的信号完整性、稳定性和通信质量。
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
思通数科AI平台在尽职调查中的技术解析与应用
思通数科AI多模态能力平台结合OCR、NLP和深度学习技术,为IPO尽职调查、融资等重要交易环节提供智能化解决方案。平台自动识别、提取并分类海量文档,实现高效数据核验与合规性检查,显著提升审查速度和精准度,同时保障敏感信息管理和数据安全。
57 11
|
7天前
|
自然语言处理 并行计算 数据可视化
免费开源法律文档比对工具:技术解析与应用
这款免费开源的法律文档比对工具,利用先进的文本分析和自然语言处理技术,实现高效、精准的文档比对。核心功能包括文本差异检测、多格式支持、语义分析、批量处理及用户友好的可视化界面,广泛适用于法律行业的各类场景。
|
10天前
|
安全 编译器 PHP
PHP 8新特性解析与实践应用####
————探索PHP 8的创新功能及其在现代Web开发中的实际应用
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
1天前
|
存储 供应链 物联网
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
|
1天前
|
存储 供应链 安全
深度解析区块链技术的核心原理与应用前景
深度解析区块链技术的核心原理与应用前景
6 0
|
5天前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
16 0
|
8天前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####
|
12天前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
26 0

推荐镜像

更多