当前位置:网站首页>将json文件中数组转换为struct

将json文件中数组转换为struct

2022-07-26 10:25:00 青云 --小凡

场景:将json文件转换为struct,json文件可能是会有嵌套,如对象中有数组,那么这个数组转为struct时应该怎么定义呢?答案是可以用结构体指针,如

typedef struct {
  const char* fileLevelName;
//   const char* fileName;
//   const char* fileDownloadURL;
//   const char* fileChecksum;
  uint64_t fileSize;
//   encryptionType_t encryptionType;
//   const char* otaSignature;
//   uint8_t flashGroup;
//   downloadType_t downloadType;
//   installationType_t installationType;
} fileInformation_t;

typedef struct {
//   const char* ecuName;
//   uint16_t ecuAddress;
//   uint8_t fileNum;
  fileInformation_t* fileInfoArray;
} ecuDownloadTask_t;

为了简单操作,大部分都注释掉了,这是json文件

{
    "OTATaskInstruction": {
        "vin": "LBV8V3106GMG03526",
        "taskInstructionVersion": "V0.1",
        "otaTaskType": "NORMAL_TASK",
        "ecuDownloadTask": [
            {
                "ecuName": "ABC",
                "ecuAddress": "2001",
                "fileInformation": [
                    {
                        "fileLevelName": "SFBL",
                        "fileName": "S000000012003DE.MBF",
                        "installationType": "AB_SELF_INSTALLATION"
                    },
                    {
                        "fileLevelName": "SFA1",
                        "fileName": "S000000008001S000000014003P.MBF",
                        "installationType": "AB_SELF_INSTALLATION"
                    }
                ]
            },
            {
                "ecuName": "CDV",
                "ecuAddress": "2001",
                "fileInformation": [
                    {
                        "fileLevelName": "SFBL",
                        "fileName": "S000000012003DE.MBF",
                        "installationType": "AB_SELF_INSTALLATION"
                    },
                    {
                        "fileLevelName": "SFA1",
                        "fileName": "S000000008001S000000014003P.MBF",
                        "installationType": "AB_SELF_INSTALLATION"
                    }
                ]
            }
        }
    }
}

可以看出有ecuDownloadTask是数组,ecuDownloadTask中的元素fileInformation也是数组,那么就设计到一个ecuDownloadTask结构体中怎么去存fileInformation。按照前面结构体定义为结构体指针即可,最后一个需要解决的问题是怎么用代码实现?这里用的json-c库实现json文件到结构体转换,这篇就不介绍了,可以参考前面的文章。代码实现如下。

#ifdef NDEBUG
#undef NDEBUG
#endif
#include <assert.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "json.h"
#include "json_tokener.h"
int main
{

    ecuDownloadTask_t *ecu1 = (ecuDownloadTask_t*)malloc(sizeof(ecuDownloadTask_t));

	fileInformation_t *fileinfo1 = (fileInformation_t*)malloc(sizeof(fileInformation_t));
	// fileinfo1->fileLevelName = malloc(sizeof(20));
	fileinfo1->fileLevelName = "downloadFile1";
	fileinfo1->fileSize = 123;
	ecu1[0].fileInfoArray = fileinfo1;
	// printf("=====%s\n", ecu1->fileInfoArray[0].fileLevelName);
	printf("=====%s\n", ecu1[0].fileInfoArray->fileLevelName);
	// ecu1->fileInfoArray = fileinfo1;
	// printf("%s\n", ecu1->fileInfoArray->fileLevelName);

	// ecu1->fileInfoArray[0] = *fileinfo1;
	// printf("=====%ld\n", ecu1->fileInfoArray[0].fileSize);


	fileInformation_t *fileinfo2 = (fileInformation_t*)malloc(sizeof(fileInformation_t));
	// fileinfo2->fileLevelName = malloc(sizeof(20));
	fileinfo2->fileLevelName = "downloadFile2";
	fileinfo2->fileSize = 312;
	ecu1[1].fileInfoArray = fileinfo2;
	printf("-----%s\n", ecu1[1].fileInfoArray->fileLevelName);

return 0;
}

这里使用结构体数组去表示每个单独的数组结构,当然也可以使用指针加1操作,因为一个指针表示的是一整个结构体,指针加1结构体整体偏移到下一位,这里还没研究好,也就没做。

原网站

版权声明
本文为[青云 --小凡]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_41765969/article/details/125941515