Initial commit

This commit is contained in:
Your Name
2026-04-23 17:07:55 +08:00
commit b7e39e063b
16725 changed files with 1625565 additions and 0 deletions
@@ -0,0 +1,913 @@
/***********************************************************
* Copyright (C), 2021, LuxShare co.,
*
* File name : lux_json_api
*
* Description :
* JSON API
*
* History:
*
* <Date> <Author> <version> <Modification>
* 2021/04/21 Laurence Zhou 0.01 First draft
***********************************************************/
#include "lux_json_api.h"
/***********************************************************
* Name:
* LuxcJSONParseJsonFile
*
* Summary:
* parse JSON file to get the HEAD pointer(note: remeber to call Luxcjsondelete() to free memory)
*
* Return Value:
* The LuxcJSONParseJsonFile() function returns a HEAD pointer to HEAD node of the Doubly Linked List
*
* Parameter Input:
* char* pcFileName -- JSON file name with Absolute path
*
* Parameter Output:
* None
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
cJSON* LuxcJSONParseJsonFile(char* pcFileName)
{
long lLen = 0;
char* psBuf = NULL;
cJSON* psRoot = NULL;
if(NULL == pcFileName)
{
return NULL;
}
FILE* fp = LuxFopen(pcFileName, "rb+");
if (NULL == fp)
{
printf("open file %s failed.\n", pcFileName);
return NULL;
}
LuxFseek(fp, 0, SEEK_END);
lLen = LuxFtell(fp);
if (0 == lLen)
{
return NULL;
}
LuxFseek(fp, 0, SEEK_SET);
psBuf = (char *)LuxMalloc(sizeof(char) * lLen);
LuxFread(psBuf, 1, lLen, fp);
LuxFclose(fp);
cJSON_Minify(psBuf);
psRoot = cJSON_Parse(psBuf);
if (NULL == psRoot)
{
return NULL;
}
LuxFree(psBuf);
return psRoot;
}
/***********************************************************
* Name:
* LuxcJSONPrint
*
* Summary:
* Render a cJSON entity to text for transfer/storage(note: remeber to call Luxcjsonfree to free memory)
*
* Return Value:
* a string
*
* Parameter Input:
* const cJSON* psItem -- The HEAD pointer of the CJSON entity
*
* Parameter Output:
* None
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
char* LuxcJSONPrint(const cJSON* psItem)
{
if(NULL != psItem)
{
return cJSON_Print(psItem);
}
return NULL;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectItem
*
* Summary:
* Get item "pcKey" from psObject
*
* Return Value:
* Pointer to the "pcKey" cJSON node
*
* Parameter Input:
* const cJSON* psItem -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
*
* Parameter Output:
* None
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
**********************************************************/
cJSON* LuxcJSONGetObjectItem(const cJSON* const psObject, const char* const pcKey)
{
if(NULL == psObject)
{
return NULL;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return NULL;
}
if(NULL == pcKey)
{
return NULL;
}
cJSON* psTemp = NULL;
psTemp = cJSON_GetObjectItem(psObject, pcKey);
if (psTemp)
{
return psTemp;
}
else
{
return NULL;
}
}
/***********************************************************
* Name:
* LuxcJSONGetObjectIntValue
*
* Summary:
* Get int value
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psItem -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* int* piValue -- Pointer that holds the int value
*
* Parameter Output:
* piVAlue
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectIntValue(const cJSON* const psObject, const char* const pcKey,int* piValue )
{
cJSON* psItem = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == piValue)
{
return FUNC_FAILED;
}
if( NULL == (psItem = (cJSON_GetObjectItem(psObject, pcKey))))
{
return FUNC_FAILED;
}
*piValue = psItem->valueint;
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectDoubleValue
*
* Summary:
* Get double value
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psItem -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* double* pdValue -- Pointer that holds the double value
*
* Parameter Output:
* pdValue
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectDoubleValue(const cJSON* const psObject,const char* const pcKey, double* pdValue)
{
cJSON* psItem = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == pdValue)
{
return FUNC_FAILED;
}
if(NULL == (psItem = (cJSON_GetObjectItem(psObject, pcKey))))
{
return FUNC_FAILED;
}
*pdValue = psItem->valuedouble;
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectStringSize
*
* Summary:
* Get the length of String
*
* Return Value:
* length of String
*
* Parameter Input:
* const cJSON* psItem -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
*
* Parameter Output:
* None
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetOjectStringSize(const cJSON* const psObject, const char* const pcKey, int *piSize)
{
cJSON* psItem = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == piSize)
{
return FUNC_FAILED;
}
psItem = cJSON_GetObjectItem(psObject, pcKey);
*piSize = LuxStrlen(psItem->valuestring);
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectStringValue
*
* Summary:
* Get string value
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psItem -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* char* pcValue -- Pointer that holds the String value
*
* Parameter Output:
* pcValue
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectStringValue(const cJSON* const psObject, const char* const pcKey, char* pcValue )
{
cJSON* psItem = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == pcValue)
{
return FUNC_FAILED;
}
if(NULL == (psItem=(cJSON_GetObjectItem(psObject, pcKey))))
{
return FUNC_FAILED;
}
LuxStrcpy(pcValue,psItem->valuestring);
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectBooleanValue
*
* Summary:
* Get boolean value
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psItem -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* cJSON_bool* pbValue -- Pointer that holds the boolean value
*
* Parameter Output:
* pbValue
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectBooleanValue(const cJSON* const psObject, const char* const pcKey, cJSON_bool* pbValue)
{
cJSON* psItem = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == pbValue)
{
return FUNC_FAILED;
}
if(NULL == (psItem = cJSON_GetObjectItem(psObject, pcKey)))
{
return FUNC_FAILED;
}
if(false == psItem->valueint)
{
*pbValue = false;
return FUNC_OK;
}
else
{
*pbValue = true;
return FUNC_OK;
}
}
/***********************************************************
* Name:
* LuxcJSONGetObjectArraySize
*
* Summary:
* Get the array size
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psObject -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* int* piSize -- Pointer that holds the array size
*
* Parameter Output:
* piSize
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectArraySize(const cJSON* const psObject, const char* const pcKey, int* piSize)
{
cJSON* psArray = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == piSize)
{
return FUNC_FAILED;
}
if(NULL == (psArray = cJSON_GetObjectItem(psObject, pcKey)))
{
return FUNC_FAILED;
}
*piSize = cJSON_GetArraySize(psArray);
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectIntArray
*
* Summary:
* Get the int array
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psObject -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* int* piArray -- Pointer that holds the int array(if pass NULL to piArray,we can get the array size)
* int* piSize -- Pointer that holds the array size
*
* Parameter Output:
* piArray,piSize
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectIntArray(const cJSON* const psObject, const char* const pcKey, int* piArray,int* piSize)
{
cJSON *psArray = NULL;
cJSON *psTemp = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == piSize)
{
return FUNC_FAILED;
}
if(NULL == piArray )
{
if(FUNC_OK == LuxcJSONGetObjectArraySize(psObject, pcKey, piSize))
{
return FUNC_OK;
}
}
else
{
if(FUNC_FAILED == LuxcJSONGetObjectArraySize(psObject, pcKey, piSize))
{
return FUNC_FAILED;
}
if(NULL == (psArray = cJSON_GetObjectItem(psObject, pcKey)))
{
return FUNC_FAILED;
}
for (int i = 0,j = 0; i < *piSize && j < *piSize; ++i,++j)
{
psTemp = cJSON_GetArrayItem(psArray, i);
piArray[j] = psTemp->valueint;
psTemp = NULL;
}
psArray = NULL;
return FUNC_OK;
}
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectDoubleArray
*
* Summary:
* Get the double array
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psObject -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* double* piArray -- Pointer that holds the double array(if pass NULL to pdArray,we can get the array size)
* int* piSize -- Pointer that holds the array size
*
* Parameter Output:
* pdArray,piSize
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectDoubleArray(const cJSON* const psObject, const char* const pcKey, double* pdArray, int* piSize )
{
cJSON *psArray = NULL;
cJSON *psTemp = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == piSize)
{
return FUNC_FAILED;
}
if(NULL == pdArray)
{
if(FUNC_OK == LuxcJSONGetObjectArraySize(psObject, pcKey, piSize))
{
return FUNC_OK;
}
}
else
{
if(FUNC_FAILED == LuxcJSONGetObjectArraySize(psObject, pcKey, piSize))
{
return FUNC_FAILED;
}
if(NULL == (psArray = cJSON_GetObjectItem(psObject, pcKey)))
{
return FUNC_FAILED;
}
for (int i = 0,j = 0; i < *piSize && j < *piSize; ++i,++j)
{
psTemp = cJSON_GetArrayItem(psArray, i);
pdArray[j] = psTemp->valuedouble;
psTemp = NULL;
}
psArray = NULL;
return FUNC_OK;
}
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectStringArray
*
* Summary:
* Get the string array
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psObject -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* char (*pcArray)[MAXSIZE] -- Pointer that holds the string array(if pass NULL to pcArray,we can get the array size)
* int* piSize -- Pointer that holds the array size
*
* Parameter Output:
* pcArray,piSize
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectStringArray(const cJSON* const psObject, const char* const pcKey, char (*pcArray)[MAXSIZE],int* piSize)
{
cJSON* pscJSONStringArray = NULL;
cJSON* pscJSONStringTemp = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == piSize)
{
return FUNC_FAILED;
}
if(NULL == pcArray)
{
if(FUNC_OK == LuxcJSONGetObjectArraySize(psObject, pcKey, piSize))
{
return FUNC_OK;
}
}
else
{
if(FUNC_FAILED == LuxcJSONGetObjectArraySize(psObject, pcKey, piSize))
{
return FUNC_FAILED;
}
if(NULL == (pscJSONStringArray = cJSON_GetObjectItem(psObject, pcKey)))
{
return FUNC_FAILED;
}
for (int i = 0; i < *piSize; ++i)
{
pscJSONStringTemp = cJSON_GetArrayItem(pscJSONStringArray, i);
LuxStrcpy(pcArray[i],pscJSONStringTemp->valuestring);
}
return FUNC_OK;
}
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetArrayRowColumnSize
*
* Summary:
* Get the two-dimensional array's row and column
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psObject -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* int* piRow -- Pointer that holds the row size
* int* piColumn -- Pointer that holds the column size
*
* Parameter Output:
* piRow,piColumn
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetArrayRowColumnSize(const cJSON* const psObject, const char* const pcKey,int* piRow,int* piColumn)
{
cJSON* psArray =NULL;
cJSON *psArray21 = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == piRow || NULL == piColumn)
{
return FUNC_FAILED;
}
if(NULL == (psArray = cJSON_GetObjectItem(psObject, pcKey)))
{
return FUNC_FAILED;
}
*piRow = cJSON_GetArraySize(psArray);
if(NULL == (psArray21 = cJSON_GetArrayItem(psArray, 0)))
{
return FUNC_FAILED;
}
*piColumn = cJSON_GetArraySize(psArray21);
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectIntArray2
*
* Summary:
* Get the two-dimensional array
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psObject -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* int (*piArray2)[MAXSIZE] -- Pointer that holds the two-dimensional arrray
* int* piRow -- Pointer that holds the row size
* int* piColumn -- Pointer that holds the column size
*
* Parameter Output:
* piArray2,piRow,piColumn
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectIntArray2(const cJSON* const psObject, const char* const pcKey, int (*piArray2)[MAXSIZE],int* piRow, int* piColumn)
{
cJSON *psArray = NULL;
cJSON *psArrayTemp = NULL;
cJSON *psValueTemp = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == piRow || NULL == piColumn)
{
return FUNC_FAILED;
}
if(NULL == piArray2)
{
if(FUNC_OK == LuxcJSONGetArrayRowColumnSize(psObject, pcKey, piRow, piColumn))
{
return FUNC_OK;
}
}
else
{
if(FUNC_FAILED == LuxcJSONGetArrayRowColumnSize(psObject, pcKey, piRow, piColumn))
{
return FUNC_FAILED;
}
if(NULL == (psArray = cJSON_GetObjectItem(psObject, pcKey)))
{
return FUNC_FAILED;
}
for (int i = 0; i < *piRow; ++i )
{
psArrayTemp = cJSON_GetArrayItem(psArray, i);
for(int j = 0; j < *piColumn; ++j){
psValueTemp = cJSON_GetArrayItem(psArrayTemp, j);
piArray2[i][j] = psValueTemp->valueint;
psValueTemp= NULL;
}
psArrayTemp = NULL;
}
return FUNC_OK;
}
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONGetObjectDoubleArray2
*
* Summary:
* Get the two-dimensional array
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* const cJSON* psObject -- The HEAD pointer of the CJSON entity
* const char* const pcKey -- Key/Name
* double (*piArray2)[MAXSIZE] -- Pointer that holds the two-dimensional arrray
* int* piRow -- Pointer that holds the row size
* int* piColumn -- Pointer that holds the column size
*
* Parameter Output:
* pdArray2,piRow,piColumn
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONGetObjectDoubleArray2(const cJSON* const psObject, const char* const pcKey, double (*pdArray2)[MAXSIZE],int* piRow, int* piColumn)
{
cJSON *psArray = NULL;
cJSON *psArrayTemp = NULL;
cJSON *PsValueTemp = NULL;
if(NULL == psObject)
{
return FUNC_FAILED;
}
if(false == cJSON_HasObjectItem(psObject, pcKey))
{
return FUNC_FAILED;
}
if(NULL == piRow || NULL == piColumn)
{
return FUNC_FAILED;
}
if(NULL == pdArray2)
{
if(FUNC_OK == LuxcJSONGetArrayRowColumnSize(psObject, pcKey, piRow, piColumn))
{
return FUNC_OK;
}
}
else
{
if(FUNC_FAILED == LuxcJSONGetArrayRowColumnSize(psObject, pcKey, piRow, piColumn))
{
return FUNC_FAILED;
}
if(NULL == (psArray = cJSON_GetObjectItem(psObject, pcKey)))
{
return FUNC_FAILED;
}
for (int i = 0; i < *piRow; ++i )
{
psArrayTemp = cJSON_GetArrayItem(psArray, i);
for(int j = 0; j < *piColumn; ++j)
{
PsValueTemp = cJSON_GetArrayItem(psArrayTemp, j);
pdArray2[i][j] = PsValueTemp->valuedouble;
PsValueTemp = NULL;
}
psArrayTemp = NULL;
}
return FUNC_OK;
}
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONDelete
*
* Summary:
* Delete a cJSON entity and all subentities
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* cJSON* psItem -- the HEAD pointer
*
* Parameter Output:
* None
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONDelete(cJSON* psItem)
{
if(NULL != psItem)
{
cJSON_Delete(psItem);
}
return FUNC_OK;
}
/***********************************************************
* Name:
* LuxcJSONFree
*
* Summary:
* free object
*
* Return Value:
* EFuncRetCode(FUNC_FAILED or FUNC_OK)
*
* Parameter Input:
* cJSON* psItem -- the HEAD pointer
*
* Parameter Output:
* None
*
* Author:
* Laurence.Zhou@luxshare-ict.com: Initial Version
*
***********************************************************/
EFuncRetCode LuxcJSONFree(void* psObject)
{
if(NULL != psObject)
{
cJSON_free(psObject);
}
return FUNC_OK;
}