2 * Copyright (c) 2009-2012, 2014-2017 Nicira, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "openvswitch/json.h"
27 #include "openvswitch/dynamic-string.h"
29 #include "openvswitch/shash.h"
33 /* The type of a JSON token. */
34 enum json_token_type
{
40 T_NAME_SEPARATOR
= ':',
41 T_VALUE_SEPARATOR
= ',',
42 T_FALSE
= UCHAR_MAX
+ 1,
52 * RFC 4627 doesn't define a lexical structure for JSON but I believe this to
53 * be compliant with the standard.
56 enum json_token_type type
;
59 long long int integer
;
65 JSON_LEX_START
, /* Not inside a token. */
66 JSON_LEX_NUMBER
, /* Reading a number. */
67 JSON_LEX_KEYWORD
, /* Reading a keyword. */
68 JSON_LEX_STRING
, /* Reading a quoted string. */
69 JSON_LEX_ESCAPE
/* In a quoted string just after a "\". */
72 enum json_parse_state
{
73 JSON_PARSE_START
, /* Beginning of input. */
74 JSON_PARSE_END
, /* End of input. */
77 JSON_PARSE_OBJECT_INIT
, /* Expecting '}' or an object name. */
78 JSON_PARSE_OBJECT_NAME
, /* Expecting an object name. */
79 JSON_PARSE_OBJECT_COLON
, /* Expecting ':'. */
80 JSON_PARSE_OBJECT_VALUE
, /* Expecting an object value. */
81 JSON_PARSE_OBJECT_NEXT
, /* Expecting ',' or '}'. */
84 JSON_PARSE_ARRAY_INIT
, /* Expecting ']' or a value. */
85 JSON_PARSE_ARRAY_VALUE
, /* Expecting a value. */
86 JSON_PARSE_ARRAY_NEXT
/* Expecting ',' or ']'. */
89 struct json_parser_node
{
97 /* Lexical analysis. */
98 enum json_lex_state lex_state
;
99 struct ds buffer
; /* Buffer for accumulating token text. */
105 enum json_parse_state parse_state
;
106 #define JSON_MAX_HEIGHT 1000
107 struct json_parser_node
*stack
;
108 size_t height
, allocated_height
;
113 char *error
; /* Error message, if any, null if none yet. */
116 static struct json
*json_create(enum json_type type
);
117 static void json_parser_input(struct json_parser
*, struct json_token
*);
119 static void json_error(struct json_parser
*p
, const char *format
, ...)
120 OVS_PRINTF_FORMAT(2, 3);
123 json_type_to_string(enum json_type type
)
154 /* Functions for manipulating struct json. */
157 json_null_create(void)
159 return json_create(JSON_NULL
);
163 json_boolean_create(bool b
)
165 return json_create(b
? JSON_TRUE
: JSON_FALSE
);
169 json_string_create_nocopy(char *s
)
171 struct json
*json
= json_create(JSON_STRING
);
177 json_string_create(const char *s
)
179 return json_string_create_nocopy(xstrdup(s
));
183 json_array_create_empty(void)
185 struct json
*json
= json_create(JSON_ARRAY
);
186 json
->u
.array
.elems
= NULL
;
188 json
->u
.array
.n_allocated
= 0;
193 json_array_add(struct json
*array_
, struct json
*element
)
195 struct json_array
*array
= json_array(array_
);
196 if (array
->n
>= array
->n_allocated
) {
197 array
->elems
= x2nrealloc(array
->elems
, &array
->n_allocated
,
198 sizeof *array
->elems
);
200 array
->elems
[array
->n
++] = element
;
204 json_array_trim(struct json
*array_
)
206 struct json_array
*array
= json_array(array_
);
207 if (array
->n
< array
->n_allocated
){
208 array
->n_allocated
= array
->n
;
209 array
->elems
= xrealloc(array
->elems
, array
->n
* sizeof *array
->elems
);
214 json_array_create(struct json
**elements
, size_t n
)
216 struct json
*json
= json_create(JSON_ARRAY
);
217 json
->u
.array
.elems
= elements
;
219 json
->u
.array
.n_allocated
= n
;
224 json_array_create_1(struct json
*elem0
)
226 struct json
**elems
= xmalloc(sizeof *elems
);
228 return json_array_create(elems
, 1);
232 json_array_create_2(struct json
*elem0
, struct json
*elem1
)
234 struct json
**elems
= xmalloc(2 * sizeof *elems
);
237 return json_array_create(elems
, 2);
241 json_array_create_3(struct json
*elem0
, struct json
*elem1
, struct json
*elem2
)
243 struct json
**elems
= xmalloc(3 * sizeof *elems
);
247 return json_array_create(elems
, 3);
251 json_object_create(void)
253 struct json
*json
= json_create(JSON_OBJECT
);
254 json
->u
.object
= xmalloc(sizeof *json
->u
.object
);
255 shash_init(json
->u
.object
);
260 json_integer_create(long long int integer
)
262 struct json
*json
= json_create(JSON_INTEGER
);
263 json
->u
.integer
= integer
;
268 json_real_create(double real
)
270 struct json
*json
= json_create(JSON_REAL
);
276 json_object_put(struct json
*json
, const char *name
, struct json
*value
)
278 json_destroy(shash_replace(json
->u
.object
, name
, value
));
282 json_object_put_string(struct json
*json
, const char *name
, const char *value
)
284 json_object_put(json
, name
, json_string_create(value
));
288 json_string(const struct json
*json
)
290 ovs_assert(json
->type
== JSON_STRING
);
291 return json
->u
.string
;
295 json_array(const struct json
*json
)
297 ovs_assert(json
->type
== JSON_ARRAY
);
298 return CONST_CAST(struct json_array
*, &json
->u
.array
);
302 json_object(const struct json
*json
)
304 ovs_assert(json
->type
== JSON_OBJECT
);
305 return CONST_CAST(struct shash
*, json
->u
.object
);
309 json_boolean(const struct json
*json
)
311 ovs_assert(json
->type
== JSON_TRUE
|| json
->type
== JSON_FALSE
);
312 return json
->type
== JSON_TRUE
;
316 json_real(const struct json
*json
)
318 ovs_assert(json
->type
== JSON_REAL
|| json
->type
== JSON_INTEGER
);
319 return json
->type
== JSON_REAL
? json
->u
.real
: json
->u
.integer
;
323 json_integer(const struct json
*json
)
325 ovs_assert(json
->type
== JSON_INTEGER
);
326 return json
->u
.integer
;
329 static void json_destroy_object(struct shash
*object
);
330 static void json_destroy_array(struct json_array
*array
);
332 /* Frees 'json' and everything it points to, recursively. */
334 json_destroy(struct json
*json
)
336 if (json
&& !--json
->count
) {
337 switch (json
->type
) {
339 json_destroy_object(json
->u
.object
);
343 json_destroy_array(&json
->u
.array
);
347 free(json
->u
.string
);
365 json_destroy_object(struct shash
*object
)
367 struct shash_node
*node
, *next
;
369 SHASH_FOR_EACH_SAFE (node
, next
, object
) {
370 struct json
*value
= node
->data
;
373 shash_delete(object
, node
);
375 shash_destroy(object
);
380 json_destroy_array(struct json_array
*array
)
384 for (i
= 0; i
< array
->n
; i
++) {
385 json_destroy(array
->elems
[i
]);
390 static struct json
*json_clone_object(const struct shash
*object
);
391 static struct json
*json_clone_array(const struct json_array
*array
);
393 /* Returns a deep copy of 'json'. */
395 json_deep_clone(const struct json
*json
)
397 switch (json
->type
) {
399 return json_clone_object(json
->u
.object
);
402 return json_clone_array(&json
->u
.array
);
405 return json_string_create(json
->u
.string
);
410 return json_create(json
->type
);
413 return json_integer_create(json
->u
.integer
);
416 return json_real_create(json
->u
.real
);
424 /* Returns 'json', with the reference count incremented. */
426 json_clone(const struct json
*json_
)
428 struct json
*json
= CONST_CAST(struct json
*, json_
);
434 json_nullable_clone(const struct json
*json
)
436 return json
? json_clone(json
) : NULL
;
440 json_clone_object(const struct shash
*object
)
442 struct shash_node
*node
;
445 json
= json_object_create();
446 SHASH_FOR_EACH (node
, object
) {
447 struct json
*value
= node
->data
;
448 json_object_put(json
, node
->name
, json_clone(value
));
454 json_clone_array(const struct json_array
*array
)
459 elems
= xmalloc(array
->n
* sizeof *elems
);
460 for (i
= 0; i
< array
->n
; i
++) {
461 elems
[i
] = json_clone(array
->elems
[i
]);
463 return json_array_create(elems
, array
->n
);
467 json_hash_object(const struct shash
*object
, size_t basis
)
469 const struct shash_node
**nodes
;
472 nodes
= shash_sort(object
);
473 n
= shash_count(object
);
474 for (i
= 0; i
< n
; i
++) {
475 const struct shash_node
*node
= nodes
[i
];
476 basis
= hash_string(node
->name
, basis
);
477 basis
= json_hash(node
->data
, basis
);
484 json_hash_array(const struct json_array
*array
, size_t basis
)
488 basis
= hash_int(array
->n
, basis
);
489 for (i
= 0; i
< array
->n
; i
++) {
490 basis
= json_hash(array
->elems
[i
], basis
);
496 json_hash(const struct json
*json
, size_t basis
)
498 switch (json
->type
) {
500 return json_hash_object(json
->u
.object
, basis
);
503 return json_hash_array(&json
->u
.array
, basis
);
506 return hash_string(json
->u
.string
, basis
);
511 return hash_int(json
->type
<< 8, basis
);
514 return hash_int(json
->u
.integer
, basis
);
517 return hash_double(json
->u
.real
, basis
);
526 json_equal_object(const struct shash
*a
, const struct shash
*b
)
528 struct shash_node
*a_node
;
530 if (shash_count(a
) != shash_count(b
)) {
534 SHASH_FOR_EACH (a_node
, a
) {
535 struct shash_node
*b_node
= shash_find(b
, a_node
->name
);
536 if (!b_node
|| !json_equal(a_node
->data
, b_node
->data
)) {
545 json_equal_array(const struct json_array
*a
, const struct json_array
*b
)
553 for (i
= 0; i
< a
->n
; i
++) {
554 if (!json_equal(a
->elems
[i
], b
->elems
[i
])) {
563 json_equal(const struct json
*a
, const struct json
*b
)
569 if (a
->type
!= b
->type
) {
575 return json_equal_object(a
->u
.object
, b
->u
.object
);
578 return json_equal_array(&a
->u
.array
, &b
->u
.array
);
581 return !strcmp(a
->u
.string
, b
->u
.string
);
589 return a
->u
.integer
== b
->u
.integer
;
592 return a
->u
.real
== b
->u
.real
;
600 /* Lexical analysis. */
603 json_lex_keyword(struct json_parser
*p
)
605 struct json_token token
;
608 s
= ds_cstr(&p
->buffer
);
609 if (!strcmp(s
, "false")) {
610 token
.type
= T_FALSE
;
611 } else if (!strcmp(s
, "true")) {
613 } else if (!strcmp(s
, "null")) {
616 json_error(p
, "invalid keyword '%s'", s
);
619 json_parser_input(p
, &token
);
623 json_lex_number(struct json_parser
*p
)
625 const char *cp
= ds_cstr(&p
->buffer
);
626 unsigned long long int significand
= 0;
627 struct json_token token
;
628 bool imprecise
= false;
629 bool negative
= false;
632 /* Leading minus sign. */
638 /* At least one integer digit, but 0 may not be used as a leading digit for
639 * a longer number. */
643 if (isdigit((unsigned char) *cp
)) {
644 json_error(p
, "leading zeros not allowed");
647 } else if (isdigit((unsigned char) *cp
)) {
649 if (significand
<= ULLONG_MAX
/ 10) {
650 significand
= significand
* 10 + (*cp
- '0');
658 } while (isdigit((unsigned char) *cp
));
660 json_error(p
, "'-' must be followed by digit");
664 /* Optional fraction. */
667 if (!isdigit((unsigned char) *cp
)) {
668 json_error(p
, "decimal point must be followed by digit");
672 if (significand
<= ULLONG_MAX
/ 10) {
673 significand
= significand
* 10 + (*cp
- '0');
675 } else if (*cp
!= '0') {
679 } while (isdigit((unsigned char) *cp
));
682 /* Optional exponent. */
683 if (*cp
== 'e' || *cp
== 'E') {
684 bool negative_exponent
= false;
690 } else if (*cp
== '-') {
691 negative_exponent
= true;
695 if (!isdigit((unsigned char) *cp
)) {
696 json_error(p
, "exponent must contain at least one digit");
702 if (exponent
>= INT_MAX
/ 10) {
703 json_error(p
, "exponent outside valid range");
706 exponent
= exponent
* 10 + (*cp
- '0');
708 } while (isdigit((unsigned char) *cp
));
710 if (negative_exponent
) {
718 json_error(p
, "syntax error in number");
722 /* Figure out number.
724 * We suppress negative zeros as a matter of policy. */
726 token
.type
= T_INTEGER
;
728 json_parser_input(p
, &token
);
733 while (pow10
> 0 && significand
< ULLONG_MAX
/ 10) {
737 while (pow10
< 0 && significand
% 10 == 0) {
742 && significand
<= (negative
743 ? (unsigned long long int) LLONG_MAX
+ 1
745 token
.type
= T_INTEGER
;
746 token
.u
.integer
= negative
? -significand
: significand
;
747 json_parser_input(p
, &token
);
753 if (!str_to_double(ds_cstr(&p
->buffer
), &token
.u
.real
)) {
754 json_error(p
, "number outside valid range");
757 /* Suppress negative zero. */
758 if (token
.u
.real
== 0) {
761 json_parser_input(p
, &token
);
765 json_lex_4hex(const char *cp
, const char *end
, int *valuep
)
771 return "quoted string ends within \\u escape";
774 value
= hexits_value(cp
, 4, &ok
);
776 return "malformed \\u escape";
779 return "null bytes not supported in quoted strings";
786 json_lex_unicode(const char *cp
, const char *end
, struct ds
*out
)
791 error
= json_lex_4hex(cp
, end
, &c0
);
794 ds_put_cstr(out
, error
);
798 if (!uc_is_leading_surrogate(c0
)) {
799 ds_put_utf8(out
, c0
);
803 if (cp
+ 2 > end
|| *cp
++ != '\\' || *cp
++ != 'u') {
805 ds_put_cstr(out
, "malformed escaped surrogate pair");
809 error
= json_lex_4hex(cp
, end
, &c1
);
812 ds_put_cstr(out
, error
);
816 if (!uc_is_trailing_surrogate(c1
)) {
818 ds_put_cstr(out
, "second half of escaped surrogate pair is not "
819 "trailing surrogate");
823 ds_put_utf8(out
, utf16_decode_surrogate_pair(c0
, c1
));
828 json_string_unescape(const char *in
, size_t in_len
, char **outp
)
830 const char *end
= in
+ in_len
;
835 ds_reserve(&out
, in_len
);
839 ds_put_cstr(&out
, "quoted string may not include unescaped \"");
843 ds_put_char(&out
, *in
++);
849 /* The JSON parser will never trigger this message, because its
850 * lexer will never pass in a string that ends in a single
851 * backslash, but json_string_unescape() has other callers that
852 * are not as careful.*/
854 ds_put_cstr(&out
, "quoted string may not end with backslash");
858 case '"': case '\\': case '/':
859 ds_put_char(&out
, in
[-1]);
863 ds_put_char(&out
, '\b');
867 ds_put_char(&out
, '\f');
871 ds_put_char(&out
, '\n');
875 ds_put_char(&out
, '\r');
879 ds_put_char(&out
, '\t');
883 in
= json_lex_unicode(in
, end
, &out
);
891 ds_put_format(&out
, "bad escape \\%c", in
[-1]);
898 *outp
= ds_cstr(&out
);
903 json_string_escape(const char *in
, struct ds
*out
)
907 .u
.string
= CONST_CAST(char *, in
),
909 json_to_ds(&json
, 0, out
);
913 json_parser_input_string(struct json_parser
*p
, const char *s
)
915 struct json_token token
;
917 token
.type
= T_STRING
;
919 json_parser_input(p
, &token
);
923 json_lex_string(struct json_parser
*p
)
925 const char *raw
= ds_cstr(&p
->buffer
);
926 if (!strchr(raw
, '\\')) {
927 json_parser_input_string(p
, raw
);
931 if (json_string_unescape(raw
, strlen(raw
), &cooked
)) {
932 json_parser_input_string(p
, cooked
);
934 json_error(p
, "%s", cooked
);
942 json_lex_input(struct json_parser
*p
, unsigned char c
)
944 struct json_token token
;
946 switch (p
->lex_state
) {
949 case ' ': case '\t': case '\n': case '\r':
953 case 'a': case 'b': case 'c': case 'd': case 'e':
954 case 'f': case 'g': case 'h': case 'i': case 'j':
955 case 'k': case 'l': case 'm': case 'n': case 'o':
956 case 'p': case 'q': case 'r': case 's': case 't':
957 case 'u': case 'v': case 'w': case 'x': case 'y':
959 p
->lex_state
= JSON_LEX_KEYWORD
;
962 case '[': case '{': case ']': case '}': case ':': case ',':
964 json_parser_input(p
, &token
);
968 case '0': case '1': case '2': case '3': case '4':
969 case '5': case '6': case '7': case '8': case '9':
970 p
->lex_state
= JSON_LEX_NUMBER
;
974 p
->lex_state
= JSON_LEX_STRING
;
979 json_error(p
, "invalid character '%c'", c
);
981 json_error(p
, "invalid character U+%04x", c
);
987 case JSON_LEX_KEYWORD
:
988 if (!isalpha((unsigned char) c
)) {
994 case JSON_LEX_NUMBER
:
995 if (!strchr(".0123456789eE-+", c
)) {
1001 case JSON_LEX_STRING
:
1003 p
->lex_state
= JSON_LEX_ESCAPE
;
1004 } else if (c
== '"') {
1007 } else if (c
< 0x20) {
1008 json_error(p
, "U+%04X must be escaped in quoted string", c
);
1013 case JSON_LEX_ESCAPE
:
1014 p
->lex_state
= JSON_LEX_STRING
;
1020 ds_put_char(&p
->buffer
, c
);
1026 /* Parses 'string' as a JSON object or array and returns a newly allocated
1027 * 'struct json'. The caller must free the returned structure with
1028 * json_destroy() when it is no longer needed.
1030 * 'string' must be encoded in UTF-8.
1032 * If 'string' is valid JSON, then the returned 'struct json' will be either an
1033 * object (JSON_OBJECT) or an array (JSON_ARRAY).
1035 * If 'string' is not valid JSON, then the returned 'struct json' will be a
1036 * string (JSON_STRING) that describes the particular error encountered during
1037 * parsing. (This is an acceptable means of error reporting because at its top
1038 * level JSON must be either an object or an array; a bare string is not
1041 json_from_string(const char *string
)
1043 struct json_parser
*p
= json_parser_create(JSPF_TRAILER
);
1044 json_parser_feed(p
, string
, strlen(string
));
1045 return json_parser_finish(p
);
1048 /* Reads the file named 'file_name', parses its contents as a JSON object or
1049 * array, and returns a newly allocated 'struct json'. The caller must free
1050 * the returned structure with json_destroy() when it is no longer needed.
1052 * The file must be encoded in UTF-8.
1054 * See json_from_string() for return value semantics.
1057 json_from_file(const char *file_name
)
1062 stream
= fopen(file_name
, "r");
1064 return json_string_create_nocopy(
1065 xasprintf("error opening \"%s\": %s", file_name
,
1066 ovs_strerror(errno
)));
1068 json
= json_from_stream(stream
);
1074 /* Parses the contents of 'stream' as a JSON object or array, and returns a
1075 * newly allocated 'struct json'. The caller must free the returned structure
1076 * with json_destroy() when it is no longer needed.
1078 * The file must be encoded in UTF-8.
1080 * See json_from_string() for return value semantics.
1083 json_from_stream(FILE *stream
)
1085 struct json_parser
*p
;
1088 p
= json_parser_create(JSPF_TRAILER
);
1090 char buffer
[BUFSIZ
];
1093 n
= fread(buffer
, 1, sizeof buffer
, stream
);
1094 if (!n
|| json_parser_feed(p
, buffer
, n
) != n
) {
1098 json
= json_parser_finish(p
);
1100 if (ferror(stream
)) {
1102 json
= json_string_create_nocopy(
1103 xasprintf("error reading JSON stream: %s", ovs_strerror(errno
)));
1109 struct json_parser
*
1110 json_parser_create(int flags
)
1112 struct json_parser
*p
= xzalloc(sizeof *p
);
1118 json_parser_feed(struct json_parser
*p
, const char *input
, size_t n
)
1121 for (i
= 0; !p
->done
&& i
< n
; ) {
1122 if (json_lex_input(p
, input
[i
])) {
1124 if (input
[i
] == '\n') {
1125 p
->column_number
= 0;
1137 json_parser_is_done(const struct json_parser
*p
)
1143 json_parser_finish(struct json_parser
*p
)
1147 switch (p
->lex_state
) {
1148 case JSON_LEX_START
:
1151 case JSON_LEX_STRING
:
1152 case JSON_LEX_ESCAPE
:
1153 json_error(p
, "unexpected end of input in quoted string");
1156 case JSON_LEX_NUMBER
:
1157 case JSON_LEX_KEYWORD
:
1158 json_lex_input(p
, ' ');
1162 if (p
->parse_state
== JSON_PARSE_START
) {
1163 json_error(p
, "empty input stream");
1164 } else if (p
->parse_state
!= JSON_PARSE_END
) {
1165 json_error(p
, "unexpected end of input");
1169 ovs_assert(p
->height
== 1);
1170 ovs_assert(p
->stack
[0].json
!= NULL
);
1171 json
= p
->stack
[--p
->height
].json
;
1173 json
= json_string_create_nocopy(p
->error
);
1177 json_parser_abort(p
);
1183 json_parser_abort(struct json_parser
*p
)
1186 ds_destroy(&p
->buffer
);
1188 json_destroy(p
->stack
[0].json
);
1191 free(p
->member_name
);
1197 static struct json_parser_node
*
1198 json_parser_top(struct json_parser
*p
)
1200 return &p
->stack
[p
->height
- 1];
1204 json_parser_put_value(struct json_parser
*p
, struct json
*value
)
1206 struct json_parser_node
*node
= json_parser_top(p
);
1207 if (node
->json
->type
== JSON_OBJECT
) {
1208 json_object_put(node
->json
, p
->member_name
, value
);
1209 free(p
->member_name
);
1210 p
->member_name
= NULL
;
1211 } else if (node
->json
->type
== JSON_ARRAY
) {
1212 json_array_add(node
->json
, value
);
1219 json_parser_push(struct json_parser
*p
,
1220 struct json
*new_json
, enum json_parse_state new_state
)
1222 if (p
->height
< JSON_MAX_HEIGHT
) {
1223 struct json_parser_node
*node
;
1225 if (p
->height
>= p
->allocated_height
) {
1226 p
->stack
= x2nrealloc(p
->stack
, &p
->allocated_height
,
1230 if (p
->height
> 0) {
1231 json_parser_put_value(p
, new_json
);
1234 node
= &p
->stack
[p
->height
++];
1235 node
->json
= new_json
;
1236 p
->parse_state
= new_state
;
1238 json_destroy(new_json
);
1239 json_error(p
, "input exceeds maximum nesting depth %d",
1245 json_parser_push_object(struct json_parser
*p
)
1247 json_parser_push(p
, json_object_create(), JSON_PARSE_OBJECT_INIT
);
1251 json_parser_push_array(struct json_parser
*p
)
1253 json_parser_push(p
, json_array_create_empty(), JSON_PARSE_ARRAY_INIT
);
1257 json_parse_value(struct json_parser
*p
, struct json_token
*token
,
1258 enum json_parse_state next_state
)
1262 switch (token
->type
) {
1264 value
= json_boolean_create(false);
1268 value
= json_null_create();
1272 value
= json_boolean_create(true);
1276 json_parser_push_object(p
);
1280 json_parser_push_array(p
);
1284 value
= json_integer_create(token
->u
.integer
);
1288 value
= json_real_create(token
->u
.real
);
1292 value
= json_string_create(token
->u
.string
);
1301 json_error(p
, "syntax error expecting value");
1305 json_parser_put_value(p
, value
);
1306 p
->parse_state
= next_state
;
1310 json_parser_pop(struct json_parser
*p
)
1312 struct json_parser_node
*node
;
1314 /* Conserve memory. */
1315 node
= json_parser_top(p
);
1316 if (node
->json
->type
== JSON_ARRAY
) {
1317 json_array_trim(node
->json
);
1320 /* Pop off the top-of-stack. */
1321 if (p
->height
== 1) {
1322 p
->parse_state
= JSON_PARSE_END
;
1323 if (!(p
->flags
& JSPF_TRAILER
)) {
1328 node
= json_parser_top(p
);
1329 if (node
->json
->type
== JSON_ARRAY
) {
1330 p
->parse_state
= JSON_PARSE_ARRAY_NEXT
;
1331 } else if (node
->json
->type
== JSON_OBJECT
) {
1332 p
->parse_state
= JSON_PARSE_OBJECT_NEXT
;
1340 json_parser_input(struct json_parser
*p
, struct json_token
*token
)
1342 switch (p
->parse_state
) {
1343 case JSON_PARSE_START
:
1344 if (token
->type
== '{') {
1345 json_parser_push_object(p
);
1346 } else if (token
->type
== '[') {
1347 json_parser_push_array(p
);
1349 json_error(p
, "syntax error at beginning of input");
1353 case JSON_PARSE_END
:
1354 json_error(p
, "trailing garbage at end of input");
1357 case JSON_PARSE_OBJECT_INIT
:
1358 if (token
->type
== '}') {
1363 case JSON_PARSE_OBJECT_NAME
:
1364 if (token
->type
== T_STRING
) {
1365 p
->member_name
= xstrdup(token
->u
.string
);
1366 p
->parse_state
= JSON_PARSE_OBJECT_COLON
;
1368 json_error(p
, "syntax error parsing object expecting string");
1372 case JSON_PARSE_OBJECT_COLON
:
1373 if (token
->type
== ':') {
1374 p
->parse_state
= JSON_PARSE_OBJECT_VALUE
;
1376 json_error(p
, "syntax error parsing object expecting ':'");
1380 case JSON_PARSE_OBJECT_VALUE
:
1381 json_parse_value(p
, token
, JSON_PARSE_OBJECT_NEXT
);
1384 case JSON_PARSE_OBJECT_NEXT
:
1385 if (token
->type
== ',') {
1386 p
->parse_state
= JSON_PARSE_OBJECT_NAME
;
1387 } else if (token
->type
== '}') {
1390 json_error(p
, "syntax error expecting '}' or ','");
1394 case JSON_PARSE_ARRAY_INIT
:
1395 if (token
->type
== ']') {
1400 case JSON_PARSE_ARRAY_VALUE
:
1401 json_parse_value(p
, token
, JSON_PARSE_ARRAY_NEXT
);
1404 case JSON_PARSE_ARRAY_NEXT
:
1405 if (token
->type
== ',') {
1406 p
->parse_state
= JSON_PARSE_ARRAY_VALUE
;
1407 } else if (token
->type
== ']') {
1410 json_error(p
, "syntax error expecting ']' or ','");
1418 p
->lex_state
= JSON_LEX_START
;
1419 ds_clear(&p
->buffer
);
1422 static struct json
*
1423 json_create(enum json_type type
)
1425 struct json
*json
= xmalloc(sizeof *json
);
1432 json_error(struct json_parser
*p
, const char *format
, ...)
1439 ds_put_format(&msg
, "line %d, column %d, byte %d: ",
1440 p
->line_number
, p
->column_number
, p
->byte_number
);
1441 va_start(args
, format
);
1442 ds_put_format_valist(&msg
, format
, args
);
1445 p
->error
= ds_steal_cstr(&msg
);
1451 #define SPACES_PER_LEVEL 2
1453 struct json_serializer
{
1459 static void json_serialize(const struct json
*, struct json_serializer
*);
1460 static void json_serialize_object(const struct shash
*object
,
1461 struct json_serializer
*);
1462 static void json_serialize_array(const struct json_array
*,
1463 struct json_serializer
*);
1464 static void json_serialize_string(const char *, struct ds
*);
1466 /* Converts 'json' to a string in JSON format, encoded in UTF-8, and returns
1467 * that string. The caller is responsible for freeing the returned string,
1468 * with free(), when it is no longer needed.
1470 * If 'flags' contains JSSF_PRETTY, the output is pretty-printed with each
1471 * nesting level introducing an additional indentation. Otherwise, the
1472 * returned string does not contain any new-line characters.
1474 * If 'flags' contains JSSF_SORT, members of objects in the output are sorted
1475 * in bytewise lexicographic order for reproducibility. Otherwise, members of
1476 * objects are output in an indeterminate order.
1478 * The returned string is valid JSON only if 'json' represents an array or an
1479 * object, since a bare literal does not satisfy the JSON grammar. */
1481 json_to_string(const struct json
*json
, int flags
)
1486 json_to_ds(json
, flags
, &ds
);
1487 return ds_steal_cstr(&ds
);
1490 /* Same as json_to_string(), but the output is appended to 'ds'. */
1492 json_to_ds(const struct json
*json
, int flags
, struct ds
*ds
)
1494 struct json_serializer s
;
1499 json_serialize(json
, &s
);
1503 json_serialize(const struct json
*json
, struct json_serializer
*s
)
1505 struct ds
*ds
= s
->ds
;
1507 switch (json
->type
) {
1509 ds_put_cstr(ds
, "null");
1513 ds_put_cstr(ds
, "false");
1517 ds_put_cstr(ds
, "true");
1521 json_serialize_object(json
->u
.object
, s
);
1525 json_serialize_array(&json
->u
.array
, s
);
1529 ds_put_format(ds
, "%lld", json
->u
.integer
);
1533 ds_put_format(ds
, "%.*g", DBL_DIG
, json
->u
.real
);
1537 json_serialize_string(json
->u
.string
, ds
);
1547 indent_line(struct json_serializer
*s
)
1549 if (s
->flags
& JSSF_PRETTY
) {
1550 ds_put_char(s
->ds
, '\n');
1551 ds_put_char_multiple(s
->ds
, ' ', SPACES_PER_LEVEL
* s
->depth
);
1556 json_serialize_object_member(size_t i
, const struct shash_node
*node
,
1557 struct json_serializer
*s
)
1559 struct ds
*ds
= s
->ds
;
1562 ds_put_char(ds
, ',');
1566 json_serialize_string(node
->name
, ds
);
1567 ds_put_char(ds
, ':');
1568 if (s
->flags
& JSSF_PRETTY
) {
1569 ds_put_char(ds
, ' ');
1571 json_serialize(node
->data
, s
);
1575 json_serialize_object(const struct shash
*object
, struct json_serializer
*s
)
1577 struct ds
*ds
= s
->ds
;
1579 ds_put_char(ds
, '{');
1584 if (s
->flags
& JSSF_SORT
) {
1585 const struct shash_node
**nodes
;
1588 nodes
= shash_sort(object
);
1589 n
= shash_count(object
);
1590 for (i
= 0; i
< n
; i
++) {
1591 json_serialize_object_member(i
, nodes
[i
], s
);
1595 struct shash_node
*node
;
1599 SHASH_FOR_EACH (node
, object
) {
1600 json_serialize_object_member(i
++, node
, s
);
1604 ds_put_char(ds
, '}');
1609 json_serialize_array(const struct json_array
*array
, struct json_serializer
*s
)
1611 struct ds
*ds
= s
->ds
;
1614 ds_put_char(ds
, '[');
1620 for (i
= 0; i
< array
->n
; i
++) {
1622 ds_put_char(ds
, ',');
1625 json_serialize(array
->elems
[i
], s
);
1630 ds_put_char(ds
, ']');
1633 static const char *chars_escaping
[256] = {
1634 "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", "\\u0007",
1635 "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", "\\u000e", "\\u000f",
1636 "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", "\\u0015", "\\u0016", "\\u0017",
1637 "\\u0018", "\\u0019", "\\u001a", "\\u001b", "\\u001c", "\\u001d", "\\u001e", "\\u001f",
1638 " ", "!", "\\\"", "#", "$", "%", "&", "'",
1639 "(", ")", "*", "+", ",", "-", ".", "/",
1640 "0", "1", "2", "3", "4", "5", "6", "7",
1641 "8", "9", ":", ";", "<", "=", ">", "?",
1642 "@", "A", "B", "C", "D", "E", "F", "G",
1643 "H", "I", "J", "K", "L", "M", "N", "O",
1644 "P", "Q", "R", "S", "T", "U", "V", "W",
1645 "X", "Y", "Z", "[", "\\\\", "]", "^", "_",
1646 "`", "a", "b", "c", "d", "e", "f", "g",
1647 "h", "i", "j", "k", "l", "m", "n", "o",
1648 "p", "q", "r", "s", "t", "u", "v", "w",
1649 "x", "y", "z", "{", "|", "}", "~", "\x7f",
1650 "\x80", "\x81", "\x82", "\x83", "\x84", "\x85", "\x86", "\x87",
1651 "\x88", "\x89", "\x8a", "\x8b", "\x8c", "\x8d", "\x8e", "\x8f",
1652 "\x90", "\x91", "\x92", "\x93", "\x94", "\x95", "\x96", "\x97",
1653 "\x98", "\x99", "\x9a", "\x9b", "\x9c", "\x9d", "\x9e", "\x9f",
1654 "\xa0", "\xa1", "\xa2", "\xa3", "\xa4", "\xa5", "\xa6", "\xa7",
1655 "\xa8", "\xa9", "\xaa", "\xab", "\xac", "\xad", "\xae", "\xaf",
1656 "\xb0", "\xb1", "\xb2", "\xb3", "\xb4", "\xb5", "\xb6", "\xb7",
1657 "\xb8", "\xb9", "\xba", "\xbb", "\xbc", "\xbd", "\xbe", "\xbf",
1658 "\xc0", "\xc1", "\xc2", "\xc3", "\xc4", "\xc5", "\xc6", "\xc7",
1659 "\xc8", "\xc9", "\xca", "\xcb", "\xcc", "\xcd", "\xce", "\xcf",
1660 "\xd0", "\xd1", "\xd2", "\xd3", "\xd4", "\xd5", "\xd6", "\xd7",
1661 "\xd8", "\xd9", "\xda", "\xdb", "\xdc", "\xdd", "\xde", "\xdf",
1662 "\xe0", "\xe1", "\xe2", "\xe3", "\xe4", "\xe5", "\xe6", "\xe7",
1663 "\xe8", "\xe9", "\xea", "\xeb", "\xec", "\xed", "\xee", "\xef",
1664 "\xf0", "\xf1", "\xf2", "\xf3", "\xf4", "\xf5", "\xf6", "\xf7",
1665 "\xf8", "\xf9", "\xfa", "\xfb", "\xfc", "\xfd", "\xfe", "\xff"
1669 json_serialize_string(const char *string
, struct ds
*ds
)
1675 ds_put_char(ds
, '"');
1676 while ((c
= *string
++) != '\0') {
1677 escape
= chars_escaping
[c
];
1678 while ((c2
= *escape
++) != '\0') {
1679 ds_put_char(ds
, c2
);
1682 ds_put_char(ds
, '"');