Decoding JSON data
QNX SDP8.0JSON Library ReferenceAPIDeveloper
The following code sample uses the libjson library to parse a JSON string and store the fields in a data structure for later use.
The extract_file_info() function parses the passed-in string, which stores information about a file, and writes the various fields into a file_t structure that the caller can then read using the pointer it provided to the function.
#include <string.h>
#include <stdio.h>
#include <sys/json.h>
typedef struct {
const char *path;
int type;
long long size;
} info_t;
typedef struct {
int id;
info_t info;
} file_t;
bool extract_file_info(const char *str, file_t *file_info)
{
json_decoder_t *dec = json_decoder_create();
json_decoder_parse_json_str(dec, str);
// Pre-initialise the structure so that omitted optional fields have default values
memset(file_info, 0, sizeof(*file_info));
file_info->info.type = 1;
// Extract data from the decoder. One can choose to check each call for success if
// it's important to report precise errors. Alternatively, as is done here, one can
// ignore intermediate errors and just check the final status.
json_decoder_push_object(dec, NULL, false);
json_decoder_get_int(dec, "id", &file_info->id, false);
json_decoder_push_object(dec, "info", false);
json_decoder_get_string(dec, "path", &file_info->info.path, false);
// The 'type' is optional. If not present, the call will fail but will not affect
// the decoder's status. We've initialized the field to the value it should have
// if not present, so it doesn't have to be there.
json_decoder_get_int(dec, "type", &file_info->info.type, true);
// The 'size' is also optional.
json_decoder_get_int_ll(dec, "size", &file_info->info.size, true);
json_decoder_error_t status = json_decoder_get_status(dec, true);
// While one might usually use a decoder to decode multiple strings, we just free it
json_decoder_destroy(dec);
// If everything above has succeeded, json_decoder_get_status() will return
// JSON_DECODER_OK
if ( status != JSON_DECODER_OK ) {
printf("Data extraction failed\n");
return false;
}
return true;
}
Page updated: