将json文件中数组转换为struct

场景:将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结构体整体偏移到下一位,这里还没研究好,也就没做。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值