Zephyr Project API 4.1.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
json.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_DATA_JSON_H_
8#define ZEPHYR_INCLUDE_DATA_JSON_H_
9
10#include <zephyr/sys/util.h>
11#include <stddef.h>
12#include <zephyr/toolchain.h>
13#include <zephyr/types.h>
14#include <sys/types.h>
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
27 /* Before changing this enum, ensure that its maximum
28 * value is still within 7 bits. See comment next to the
29 * declaration of `type` in struct json_obj_descr.
30 */
31
57};
58
59struct json_token {
61 char *start;
62 char *end;
63};
64
65struct json_lexer {
66 void *(*state)(struct json_lexer *lex);
67 char *start;
68 char *pos;
69 char *end;
71};
72
73struct json_obj {
75};
76
78 char *start;
79 size_t length;
80};
81
82
84 const char *field_name;
85
86 /* Alignment can be 1, 2, 4, or 8. The macros to create
87 * a struct json_obj_descr will store the alignment's
88 * power of 2 in order to keep this value in the 0-3 range
89 * and thus use only 2 bits.
90 */
92
93 /* 127 characters is more than enough for a field name. */
95
96 /* Valid values here (enum json_tokens): JSON_TOK_STRING,
97 * JSON_TOK_NUMBER, JSON_TOK_TRUE, JSON_TOK_FALSE,
98 * JSON_TOK_OBJECT_START, JSON_TOK_ARRAY_START. (All others
99 * ignored.) Maximum value is '}' (125), so this has to be 7 bits
100 * long.
101 */
103
104 /* 65535 bytes is more than enough for many JSON payloads. */
106
107 union {
108 struct {
112 struct {
116 struct {
117 size_t size;
119 };
120};
121
134typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
135 void *data);
136
137#define Z_ALIGN_SHIFT(type) (__alignof__(type) == 1 ? 0 : \
138 __alignof__(type) == 2 ? 1 : \
139 __alignof__(type) == 4 ? 2 : 3)
140
161#define JSON_OBJ_DESCR_PRIM(struct_, field_name_, type_) \
162 { \
163 .field_name = (#field_name_), \
164 .align_shift = Z_ALIGN_SHIFT(struct_), \
165 .field_name_len = sizeof(#field_name_) - 1, \
166 .type = type_, \
167 .offset = offsetof(struct_, field_name_), \
168 .field = { \
169 .size = SIZEOF_FIELD(struct_, field_name_) \
170 }, \
171 }
172
197#define JSON_OBJ_DESCR_OBJECT(struct_, field_name_, sub_descr_) \
198 { \
199 .field_name = (#field_name_), \
200 .align_shift = Z_ALIGN_SHIFT(struct_), \
201 .field_name_len = (sizeof(#field_name_) - 1), \
202 .type = JSON_TOK_OBJECT_START, \
203 .offset = offsetof(struct_, field_name_), \
204 .object = { \
205 .sub_descr = sub_descr_, \
206 .sub_descr_len = ARRAY_SIZE(sub_descr_), \
207 }, \
208 }
209
219#define Z_JSON_ELEMENT_DESCR(struct_, len_field_, elem_type_, union_) \
220 (const struct json_obj_descr[]) \
221 { \
222 { \
223 .align_shift = Z_ALIGN_SHIFT(struct_), \
224 .type = elem_type_, \
225 .offset = offsetof(struct_, len_field_), \
226 union_ \
227 } \
228 }
229
236#define Z_JSON_DESCR_ARRAY(elem_descr_, elem_descr_len_) \
237 { \
238 .array = { \
239 .element_descr = elem_descr_, \
240 .n_elements = elem_descr_len_, \
241 }, \
242 }
243
250#define Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_) \
251 .object = { \
252 .sub_descr = elem_descr_, \
253 .sub_descr_len = elem_descr_len_, \
254 }, \
255
262#define Z_JSON_DESCR_FIELD(struct_, field_name_) \
263 { \
264 .field = { \
265 .size = SIZEOF_FIELD(struct_, field_name_), \
266 }, \
267 }
268
291#define JSON_OBJ_DESCR_ARRAY(struct_, field_name_, max_len_, \
292 len_field_, elem_type_) \
293 { \
294 .field_name = (#field_name_), \
295 .align_shift = Z_ALIGN_SHIFT(struct_), \
296 .field_name_len = sizeof(#field_name_) - 1, \
297 .type = JSON_TOK_ARRAY_START, \
298 .offset = offsetof(struct_, field_name_), \
299 .array = { \
300 .element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
301 elem_type_, \
302 Z_JSON_DESCR_FIELD(struct_, field_name_[0])), \
303 .n_elements = (max_len_), \
304 }, \
305 }
306
341#define JSON_OBJ_DESCR_OBJ_ARRAY(struct_, field_name_, max_len_, \
342 len_field_, elem_descr_, elem_descr_len_) \
343 { \
344 .field_name = (#field_name_), \
345 .align_shift = Z_ALIGN_SHIFT(struct_), \
346 .field_name_len = sizeof(#field_name_) - 1, \
347 .type = JSON_TOK_ARRAY_START, \
348 .offset = offsetof(struct_, field_name_), \
349 .array = { \
350 .element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
351 JSON_TOK_OBJECT_START, \
352 Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_)), \
353 .n_elements = (max_len_), \
354 }, \
355 }
356
400#define JSON_OBJ_DESCR_ARRAY_ARRAY(struct_, field_name_, max_len_, len_field_, \
401 elem_descr_, elem_descr_len_) \
402 { \
403 .field_name = (#field_name_), \
404 .align_shift = Z_ALIGN_SHIFT(struct_), \
405 .field_name_len = sizeof(#field_name_) - 1, \
406 .type = JSON_TOK_ARRAY_START, \
407 .offset = offsetof(struct_, field_name_), \
408 .array = { \
409 .element_descr = Z_JSON_ELEMENT_DESCR( \
410 struct_, len_field_, JSON_TOK_ARRAY_START, \
411 Z_JSON_DESCR_ARRAY( \
412 elem_descr_, \
413 1 + ZERO_OR_COMPILE_ERROR(elem_descr_len_ == 1))), \
414 .n_elements = (max_len_), \
415 }, \
416 }
417
435#define JSON_OBJ_DESCR_ARRAY_ARRAY_NAMED(struct_, json_field_name_, struct_field_name_, \
436 max_len_, len_field_, elem_descr_, elem_descr_len_) \
437 { \
438 .field_name = (#json_field_name_), \
439 .align_shift = Z_ALIGN_SHIFT(struct_), \
440 .field_name_len = sizeof(#json_field_name_) - 1, \
441 .type = JSON_TOK_ARRAY_START, \
442 .offset = offsetof(struct_, struct_field_name_), \
443 .array = { \
444 .element_descr = Z_JSON_ELEMENT_DESCR( \
445 struct_, len_field_, JSON_TOK_ARRAY_START, \
446 Z_JSON_DESCR_ARRAY( \
447 elem_descr_, \
448 1 + ZERO_OR_COMPILE_ERROR(elem_descr_len_ == 1))), \
449 .n_elements = (max_len_), \
450 }, \
451 }
452
467#define JSON_OBJ_DESCR_PRIM_NAMED(struct_, json_field_name_, \
468 struct_field_name_, type_) \
469 { \
470 .field_name = (json_field_name_), \
471 .align_shift = Z_ALIGN_SHIFT(struct_), \
472 .field_name_len = sizeof(json_field_name_) - 1, \
473 .type = type_, \
474 .offset = offsetof(struct_, struct_field_name_), \
475 .field = { \
476 .size = SIZEOF_FIELD(struct_, struct_field_name_) \
477 }, \
478 }
479
493#define JSON_OBJ_DESCR_OBJECT_NAMED(struct_, json_field_name_, \
494 struct_field_name_, sub_descr_) \
495 { \
496 .field_name = (json_field_name_), \
497 .align_shift = Z_ALIGN_SHIFT(struct_), \
498 .field_name_len = (sizeof(json_field_name_) - 1), \
499 .type = JSON_TOK_OBJECT_START, \
500 .offset = offsetof(struct_, struct_field_name_), \
501 .object = { \
502 .sub_descr = sub_descr_, \
503 .sub_descr_len = ARRAY_SIZE(sub_descr_), \
504 }, \
505 }
506
523#define JSON_OBJ_DESCR_ARRAY_NAMED(struct_, json_field_name_,\
524 struct_field_name_, max_len_, len_field_, \
525 elem_type_) \
526 { \
527 .field_name = (json_field_name_), \
528 .align_shift = Z_ALIGN_SHIFT(struct_), \
529 .field_name_len = sizeof(json_field_name_) - 1, \
530 .type = JSON_TOK_ARRAY_START, \
531 .offset = offsetof(struct_, struct_field_name_), \
532 .array = { \
533 .element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
534 elem_type_, \
535 Z_JSON_DESCR_FIELD(struct_, struct_field_name_[0])), \
536 .n_elements = (max_len_), \
537 }, \
538 }
539
580#define JSON_OBJ_DESCR_OBJ_ARRAY_NAMED(struct_, json_field_name_, \
581 struct_field_name_, max_len_, \
582 len_field_, elem_descr_, \
583 elem_descr_len_) \
584 { \
585 .field_name = json_field_name_, \
586 .align_shift = Z_ALIGN_SHIFT(struct_), \
587 .field_name_len = sizeof(json_field_name_) - 1, \
588 .type = JSON_TOK_ARRAY_START, \
589 .offset = offsetof(struct_, struct_field_name_), \
590 .array = { \
591 .element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
592 JSON_TOK_OBJECT_START, \
593 Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_)), \
594 .n_elements = (max_len_), \
595 }, \
596 }
597
628int64_t json_obj_parse(char *json, size_t len,
629 const struct json_obj_descr *descr, size_t descr_len,
630 void *val);
631
664int json_arr_parse(char *json, size_t len,
665 const struct json_obj_descr *descr, void *val);
666
683int json_arr_separate_object_parse_init(struct json_obj *json, char *payload, size_t len);
684
699int json_arr_separate_parse_object(struct json_obj *json, const struct json_obj_descr *descr,
700 size_t descr_len, void *val);
701
714ssize_t json_escape(char *str, size_t *len, size_t buf_size);
715
724size_t json_calc_escaped_len(const char *str, size_t len);
725
737 size_t descr_len, const void *val);
738
749 const void *val);
750
764int json_obj_encode_buf(const struct json_obj_descr *descr, size_t descr_len,
765 const void *val, char *buffer, size_t buf_size);
766
779int json_arr_encode_buf(const struct json_obj_descr *descr, const void *val,
780 char *buffer, size_t buf_size);
781
795int json_obj_encode(const struct json_obj_descr *descr, size_t descr_len,
796 const void *val, json_append_bytes_t append_bytes,
797 void *data);
798
811int json_arr_encode(const struct json_obj_descr *descr, const void *val,
812 json_append_bytes_t append_bytes, void *data);
813
814#ifdef __cplusplus
815}
816#endif
817
821#endif /* ZEPHYR_INCLUDE_DATA_JSON_H_ */
json_tokens
Definition json.h:26
ssize_t json_calc_encoded_len(const struct json_obj_descr *descr, size_t descr_len, const void *val)
Calculates the string length to fully encode an object.
ssize_t json_escape(char *str, size_t *len, size_t buf_size)
Escapes the string so it can be used to encode JSON objects.
int json_arr_encode(const struct json_obj_descr *descr, const void *val, json_append_bytes_t append_bytes, void *data)
Encodes an array using an arbitrary writer function.
size_t json_calc_escaped_len(const char *str, size_t len)
Calculates the JSON-escaped string length.
int json_arr_separate_object_parse_init(struct json_obj *json, char *payload, size_t len)
Initialize single-object array parsing.
int json_arr_separate_parse_object(struct json_obj *json, const struct json_obj_descr *descr, size_t descr_len, void *val)
Parse a single object from array.
int64_t json_obj_parse(char *json, size_t len, const struct json_obj_descr *descr, size_t descr_len, void *val)
Parses the JSON-encoded object pointed to by json, with size len, according to the descriptor pointed...
int json_arr_parse(char *json, size_t len, const struct json_obj_descr *descr, void *val)
Parses the JSON-encoded array pointed to by json, with size len, according to the descriptor pointed ...
int json_obj_encode_buf(const struct json_obj_descr *descr, size_t descr_len, const void *val, char *buffer, size_t buf_size)
Encodes an object in a contiguous memory location.
int(* json_append_bytes_t)(const char *bytes, size_t len, void *data)
Function pointer type to append bytes to a buffer while encoding JSON data.
Definition json.h:134
ssize_t json_calc_encoded_arr_len(const struct json_obj_descr *descr, const void *val)
Calculates the string length to fully encode an array.
int json_arr_encode_buf(const struct json_obj_descr *descr, const void *val, char *buffer, size_t buf_size)
Encodes an array in a contiguous memory location.
int json_obj_encode(const struct json_obj_descr *descr, size_t descr_len, const void *val, json_append_bytes_t append_bytes, void *data)
Encodes an object using an arbitrary writer function.
@ JSON_TOK_STRING_BUF
Definition json.h:38
@ JSON_TOK_OBJ_ARRAY
Definition json.h:44
@ JSON_TOK_UINT
Definition json.h:51
@ JSON_TOK_ARRAY_END
Definition json.h:36
@ JSON_TOK_INT64
Definition json.h:46
@ JSON_TOK_COLON
Definition json.h:39
@ JSON_TOK_UINT64
Definition json.h:47
@ JSON_TOK_DOUBLE_FP
Definition json.h:49
@ JSON_TOK_COMMA
Definition json.h:40
@ JSON_TOK_INT
Definition json.h:50
@ JSON_TOK_OBJECT_START
Definition json.h:33
@ JSON_TOK_OBJECT_END
Definition json.h:34
@ JSON_TOK_TRUE
Definition json.h:52
@ JSON_TOK_FALSE
Definition json.h:53
@ JSON_TOK_NONE
Definition json.h:32
@ JSON_TOK_NULL
Definition json.h:54
@ JSON_TOK_OPAQUE
Definition json.h:43
@ JSON_TOK_ARRAY_START
Definition json.h:35
@ JSON_TOK_FLOAT_FP
Definition json.h:48
@ JSON_TOK_FLOAT
Definition json.h:42
@ JSON_TOK_STRING
Definition json.h:37
@ JSON_TOK_EOF
Definition json.h:56
@ JSON_TOK_NUMBER
Definition json.h:41
@ JSON_TOK_ENCODED_OBJ
Definition json.h:45
@ JSON_TOK_ERROR
Definition json.h:55
__SIZE_TYPE__ ssize_t
Definition types.h:28
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__INT64_TYPE__ int64_t
Definition stdint.h:75
Definition json.h:65
char * pos
Definition json.h:68
char * start
Definition json.h:67
struct json_token tok
Definition json.h:70
char * end
Definition json.h:69
Definition json.h:83
const struct json_obj_descr * element_descr
Definition json.h:113
const char * field_name
Definition json.h:84
struct json_obj_descr::@167::@169 object
uint32_t align_shift
Definition json.h:91
const struct json_obj_descr * sub_descr
Definition json.h:109
uint32_t field_name_len
Definition json.h:94
uint32_t offset
Definition json.h:105
struct json_obj_descr::@167::@171 field
uint32_t type
Definition json.h:102
size_t size
Definition json.h:117
struct json_obj_descr::@167::@170 array
size_t n_elements
Definition json.h:114
size_t sub_descr_len
Definition json.h:110
Definition json.h:77
size_t length
Definition json.h:79
char * start
Definition json.h:78
Definition json.h:73
struct json_lexer lex
Definition json.h:74
Definition json.h:59
char * start
Definition json.h:61
enum json_tokens type
Definition json.h:60
char * end
Definition json.h:62
Misc utilities.
Macros to abstract toolchain specific capabilities.