Skip to content

Commit

Permalink
Json helper functions.
Browse files Browse the repository at this point in the history
  • Loading branch information
ralight committed Aug 17, 2020
1 parent b91e783 commit a5f02f3
Show file tree
Hide file tree
Showing 2 changed files with 132 additions and 0 deletions.
106 changes: 106 additions & 0 deletions src/json_help.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
Copyright (c) 2020 Roger Light <[email protected]>
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
and Eclipse Distribution License v1.0 which accompany this distribution.
The Eclipse Public License is available at
http:https://www.eclipse.org/legal/epl-v10.html
and the Eclipse Distribution License is available at
http:https://www.eclipse.org/org/documents/edl-v10.php.
Contributors:
Roger Light - initial implementation and documentation.
*/

#include "config.h"

#include <cJSON.h>
#include <stdbool.h>

#include "mosquitto_broker_internal.h"


int json_get_bool(cJSON *json, const char *name, bool *value, bool optional, bool default_value)
{
cJSON *jtmp;

if(optional == true){
*value = default_value;
}

jtmp = cJSON_GetObjectItemCaseSensitive(json, name);
if(jtmp){
if(cJSON_IsBool(jtmp) == false){
return MOSQ_ERR_INVAL;
}
*value = cJSON_IsTrue(jtmp);
}else{
if(optional == false){
return MOSQ_ERR_INVAL;
}
}
return MOSQ_ERR_SUCCESS;
}


int json_get_int(cJSON *json, const char *name, int *value, bool optional, int default_value)
{
cJSON *jtmp;

if(optional == true){
*value = default_value;
}

jtmp = cJSON_GetObjectItemCaseSensitive(json, name);
if(jtmp){
if(cJSON_IsNumber(jtmp) == false){
return MOSQ_ERR_INVAL;
}
*value = jtmp->valueint;
}else{
if(optional == false){
return MOSQ_ERR_INVAL;
}
}
return MOSQ_ERR_SUCCESS;
}


int json_get_string(cJSON *json, const char *name, char **value, bool optional)
{
cJSON *jtmp;

*value = NULL;

jtmp = cJSON_GetObjectItemCaseSensitive(json, name);
if(jtmp){
if(cJSON_IsString(jtmp) == false){
return MOSQ_ERR_INVAL;
}
*value = jtmp->valuestring;
}else{
if(optional == false){
return MOSQ_ERR_INVAL;
}
}
return MOSQ_ERR_SUCCESS;
}


/* Return a number as a number, or attempt to convert a string to a number, or a bool to a number */
double json_get_as_number(const cJSON *json)
{
char *endptr = NULL;

if(cJSON_IsNumber(json)){
return json->valuedouble;
}else if(cJSON_IsString(json)){
return strtod(json->valuestring, &endptr);
}else if(cJSON_IsBool(json)){
return cJSON_IsTrue(json);
}else{
return 0.0;
}
}
26 changes: 26 additions & 0 deletions src/json_help.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#ifndef JSON_HELP_H
#define JSON_HELP_H
/*
Copyright (c) 2020 Roger Light <[email protected]>
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
and Eclipse Distribution License v1.0 which accompany this distribution.
The Eclipse Public License is available at
http:https://www.eclipse.org/legal/epl-v10.html
and the Eclipse Distribution License is available at
http:https://www.eclipse.org/org/documents/edl-v10.php.
Contributors:
Roger Light - initial implementation and documentation.
*/
#include <cJSON.h>
#include <stdbool.h>

int json_get_bool(cJSON *json, const char *name, bool *value, bool optional, bool default_value);
int json_get_int(cJSON *json, const char *name, int *value, bool optional, int default_value);
int json_get_string(cJSON *json, const char *name, char **value, bool optional);
double json_get_as_number(const cJSON *json);

#endif

0 comments on commit a5f02f3

Please sign in to comment.