93ad6a84创建于 2023年12月4日历史提交
/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "utils_json.h"

#include <stddef.h>

#include "cJSON.h"

#ifdef __cplusplus
extern "C" {
#endif

DslmJsonHandle DslmCreateJson(const char *data)
{
    cJSON *root = NULL;

    if (data != NULL) {
        root = cJSON_Parse(data);
    } else {
        root = cJSON_CreateObject();
    }
    return (void *)root;
}

void DslmDestroyJson(DslmJsonHandle handle)
{
    if (handle != NULL) {
        cJSON_Delete((cJSON *)handle);
    }
}

int32_t DslmGetJsonFieldInt(DslmJsonHandle handle, const char *field)
{
    int32_t ret = -1;

    if (handle == NULL) {
        return ret;
    }

    if (field == NULL) {
        return ((cJSON *)handle)->valueint;
    }

    cJSON *objValue = NULL;

    do {
        objValue = (cJSON *)DslmGetJsonFieldJson(handle, field);
        if (objValue == NULL) {
            break;
        }
        if (!cJSON_IsNumber(objValue)) {
            break;
        }
        ret = objValue->valueint;
    } while (0);

    return ret;
}

uint32_t DslmGetJsonFieldIntArray(DslmJsonHandle handle, const char *field, int32_t *array, int32_t arrayLen)
{
    if (handle == NULL || field == NULL || array == NULL) {
        return 0;
    }

    cJSON *objValue = cJSON_GetObjectItem(handle, field);
    if (objValue == NULL) {
        return 0;
    }
    if (!cJSON_IsArray(objValue)) {
        return 0;
    }

    int size = cJSON_GetArraySize(objValue);
    if (size > arrayLen) {
        size = arrayLen;
    }
    uint32_t index = 0;
    for (int32_t i = 0; i < size; i++) {
        cJSON *item = cJSON_GetArrayItem(objValue, i);
        if (!cJSON_IsNumber(item)) {
            continue;
        }
        array[index++] = item->valueint;
    }

    return index;
}

void DslmAddFieldBoolToJson(DslmJsonHandle handle, const char *field, bool value)
{
    if (handle == NULL || field == NULL) {
        return;
    }
    (void)cJSON_AddBoolToObject((cJSON *)handle, field, value);
}

const char *DslmGetJsonFieldString(DslmJsonHandle handle, const char *field)
{
    if (handle == NULL) {
        return NULL;
    }
    if (field == NULL) {
        return ((cJSON *)handle)->valuestring;
    }
    cJSON *objValue = NULL;
    const char *payload = NULL;

    do {
        objValue = (cJSON *)DslmGetJsonFieldJson(handle, field);
        if (objValue == NULL) {
            break;
        }
        payload = cJSON_GetStringValue(objValue);
        if (payload == NULL) {
            break;
        }
    } while (0);
    return payload;
}

DslmJsonHandle DslmGetJsonFieldJson(DslmJsonHandle handle, const char *field)
{
    return cJSON_GetObjectItem((cJSON *)handle, field);
}

DslmJsonHandle DslmGetJsonFieldJsonArray(DslmJsonHandle handle, uint32_t num)
{
    return cJSON_GetArrayItem((cJSON *)handle, num);
}

int32_t DslmGetJsonFieldJsonArraySize(DslmJsonHandle handle)
{
    return cJSON_GetArraySize((cJSON *)handle);
}

void DslmAddFieldIntToJson(DslmJsonHandle handle, const char *field, int32_t value)
{
    if (handle == NULL || field == NULL) {
        return;
    }
    (void)cJSON_AddNumberToObject((cJSON *)handle, field, value);
}

void DslmAddFieldIntArrayToJson(DslmJsonHandle handle, const char *field, const int32_t *array, int32_t arrayLen)
{
    if (handle == NULL || field == NULL || array == NULL) {
        return;
    }
    cJSON *arrayObj = cJSON_CreateIntArray(array, arrayLen);
    if (arrayObj == NULL) {
        return;
    }
    (void)cJSON_AddItemToObject((cJSON *)handle, field, arrayObj);
}

void DslmAddFieldStringToJson(DslmJsonHandle handle, const char *field, const char *value)
{
    if (handle == NULL || field == NULL || value == NULL) {
        return;
    }
    (void)cJSON_AddStringToObject((cJSON *)handle, field, value);
}

void DslmAddFieldJsonToJson(DslmJsonHandle handle, const char *field, DslmJsonHandle json)
{
    if (handle == NULL || field == NULL || json == NULL) {
        return;
    }
    (void)cJSON_AddItemToObject((cJSON *)handle, field, json);
}

char *DslmConvertJsonToString(DslmJsonHandle handle)
{
    if (handle != NULL) {
        char *ret = cJSON_PrintUnformatted((cJSON *)handle);
        return ret;
    }
    return NULL;
}

bool DslmCompareJsonData(DslmJsonHandle handleA, DslmJsonHandle handleB, bool caseSensitive)
{
    if (handleA == NULL || handleB == NULL) {
        return false;
    }
    return cJSON_Compare(handleA, handleB, caseSensitive);
}

#ifdef __cplusplus
}
#endif