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 的创建和解析的实例讲解

 

上一篇:阿里云视觉智能开放平台人脸人体中表情识别Java调用


下一篇:阿里云内容安全java SDK实现本土图片审核