]> git.proxmox.com Git - ovs.git/blob - lib/json.h
json: New function json_to_ds().
[ovs.git] / lib / json.h
1 /*
2 * Copyright (c) 2009, 2010 Nicira Networks.
3 *
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:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16
17 #ifndef JSON_H
18 #define JSON_H 1
19
20 /* This is an implementation of JavaScript Object Notation (JSON) as specified
21 * by RFC 4627. It is intended to fully comply with RFC 4627, with the
22 * following known exceptions and clarifications:
23 *
24 * - Null bytes (\u0000) are not allowed in strings.
25 *
26 * - Only UTF-8 encoding is supported (RFC 4627 allows for other Unicode
27 * encodings).
28 *
29 * - Names within an object must be unique (RFC 4627 says that they
30 * "should" be unique).
31 */
32
33 #include "shash.h"
34
35 struct ds;
36
37 /* Type of a JSON value. */
38 enum json_type {
39 JSON_NULL, /* null */
40 JSON_FALSE, /* false */
41 JSON_TRUE, /* true */
42 JSON_OBJECT, /* {"a": b, "c": d, ...} */
43 JSON_ARRAY, /* [1, 2, 3, ...] */
44 JSON_INTEGER, /* 123. */
45 JSON_REAL, /* 123.456. */
46 JSON_STRING, /* "..." */
47 JSON_N_TYPES
48 };
49
50 const char *json_type_to_string(enum json_type);
51
52 /* A JSON array. */
53 struct json_array {
54 size_t n, n_allocated;
55 struct json **elems;
56 };
57
58 /* A JSON value. */
59 struct json {
60 enum json_type type;
61 union {
62 struct shash *object; /* Contains "struct json *"s. */
63 struct json_array array;
64 long long int integer;
65 double real;
66 char *string;
67 } u;
68 };
69
70 struct json *json_null_create(void);
71 struct json *json_boolean_create(bool);
72 struct json *json_string_create(const char *);
73 struct json *json_string_create_nocopy(char *);
74 struct json *json_integer_create(long long int);
75 struct json *json_real_create(double);
76
77 struct json *json_array_create_empty(void);
78 void json_array_add(struct json *, struct json *element);
79 void json_array_trim(struct json *);
80 struct json *json_array_create(struct json **, size_t n);
81 struct json *json_array_create_1(struct json *);
82 struct json *json_array_create_2(struct json *, struct json *);
83 struct json *json_array_create_3(struct json *, struct json *, struct json *);
84
85 struct json *json_object_create(void);
86 void json_object_put(struct json *, const char *name, struct json *value);
87 void json_object_put_string(struct json *,
88 const char *name, const char *value);
89
90 const char *json_string(const struct json *);
91 struct json_array *json_array(const struct json *);
92 struct shash *json_object(const struct json *);
93 bool json_boolean(const struct json *);
94 double json_real(const struct json *);
95 int64_t json_integer(const struct json *);
96
97 struct json *json_clone(const struct json *);
98 void json_destroy(struct json *);
99
100 size_t json_hash(const struct json *, size_t basis);
101 bool json_equal(const struct json *, const struct json *);
102 \f
103 /* Parsing JSON. */
104 enum {
105 JSPF_TRAILER = 1 << 0 /* Check for garbage following input. */
106 };
107
108 struct json_parser *json_parser_create(int flags);
109 size_t json_parser_feed(struct json_parser *, const char *, size_t);
110 bool json_parser_is_done(const struct json_parser *);
111 struct json *json_parser_finish(struct json_parser *);
112 void json_parser_abort(struct json_parser *);
113
114 struct json *json_from_string(const char *string);
115 struct json *json_from_file(const char *file_name);
116 struct json *json_from_stream(FILE *stream);
117 \f
118 /* Serializing JSON. */
119
120 enum {
121 JSSF_PRETTY = 1 << 0, /* Multiple lines with indentation, if true. */
122 JSSF_SORT = 1 << 1 /* Object members in sorted order, if true. */
123 };
124 char *json_to_string(const struct json *, int flags);
125 void json_to_ds(const struct json *, int flags, struct ds *);
126 \f
127 /* JSON string formatting operations. */
128
129 bool json_string_unescape(const char *in, size_t in_len, char **outp);
130
131 #endif /* json.h */