xref: /aosp_15_r20/external/jsmn/README.md (revision 420d848fb01a502d3186bd0f49f4e0beb321f5cd)
1*420d848fSAndroid Build Coastguard WorkerJSMN
2*420d848fSAndroid Build Coastguard Worker====
3*420d848fSAndroid Build Coastguard Worker
4*420d848fSAndroid Build Coastguard Worker[![Build Status](https://travis-ci.org/zserge/jsmn.svg?branch=master)](https://travis-ci.org/zserge/jsmn)
5*420d848fSAndroid Build Coastguard Worker
6*420d848fSAndroid Build Coastguard Workerjsmn (pronounced like 'jasmine') is a minimalistic JSON parser in C.  It can be
7*420d848fSAndroid Build Coastguard Workereasily integrated into resource-limited or embedded projects.
8*420d848fSAndroid Build Coastguard Worker
9*420d848fSAndroid Build Coastguard WorkerYou can find more information about JSON format at [json.org][1]
10*420d848fSAndroid Build Coastguard Worker
11*420d848fSAndroid Build Coastguard WorkerLibrary sources are available at https://github.com/zserge/jsmn
12*420d848fSAndroid Build Coastguard Worker
13*420d848fSAndroid Build Coastguard WorkerThe web page with some information about jsmn can be found at
14*420d848fSAndroid Build Coastguard Worker[http://zserge.com/jsmn.html][2]
15*420d848fSAndroid Build Coastguard Worker
16*420d848fSAndroid Build Coastguard WorkerPhilosophy
17*420d848fSAndroid Build Coastguard Worker----------
18*420d848fSAndroid Build Coastguard Worker
19*420d848fSAndroid Build Coastguard WorkerMost JSON parsers offer you a bunch of functions to load JSON data, parse it
20*420d848fSAndroid Build Coastguard Workerand extract any value by its name. jsmn proves that checking the correctness of
21*420d848fSAndroid Build Coastguard Workerevery JSON packet or allocating temporary objects to store parsed JSON fields
22*420d848fSAndroid Build Coastguard Workeroften is an overkill.
23*420d848fSAndroid Build Coastguard Worker
24*420d848fSAndroid Build Coastguard WorkerJSON format itself is extremely simple, so why should we complicate it?
25*420d848fSAndroid Build Coastguard Worker
26*420d848fSAndroid Build Coastguard Workerjsmn is designed to be	**robust** (it should work fine even with erroneous
27*420d848fSAndroid Build Coastguard Workerdata), **fast** (it should parse data on the fly), **portable** (no superfluous
28*420d848fSAndroid Build Coastguard Workerdependencies or non-standard C extensions). And of course, **simplicity** is a
29*420d848fSAndroid Build Coastguard Workerkey feature - simple code style, simple algorithm, simple integration into
30*420d848fSAndroid Build Coastguard Workerother projects.
31*420d848fSAndroid Build Coastguard Worker
32*420d848fSAndroid Build Coastguard WorkerFeatures
33*420d848fSAndroid Build Coastguard Worker--------
34*420d848fSAndroid Build Coastguard Worker
35*420d848fSAndroid Build Coastguard Worker* compatible with C89
36*420d848fSAndroid Build Coastguard Worker* no dependencies (even libc!)
37*420d848fSAndroid Build Coastguard Worker* highly portable (tested on x86/amd64, ARM, AVR)
38*420d848fSAndroid Build Coastguard Worker* about 200 lines of code
39*420d848fSAndroid Build Coastguard Worker* extremely small code footprint
40*420d848fSAndroid Build Coastguard Worker* API contains only 2 functions
41*420d848fSAndroid Build Coastguard Worker* no dynamic memory allocation
42*420d848fSAndroid Build Coastguard Worker* incremental single-pass parsing
43*420d848fSAndroid Build Coastguard Worker* library code is covered with unit-tests
44*420d848fSAndroid Build Coastguard Worker
45*420d848fSAndroid Build Coastguard WorkerDesign
46*420d848fSAndroid Build Coastguard Worker------
47*420d848fSAndroid Build Coastguard Worker
48*420d848fSAndroid Build Coastguard WorkerThe rudimentary jsmn object is a **token**. Let's consider a JSON string:
49*420d848fSAndroid Build Coastguard Worker
50*420d848fSAndroid Build Coastguard Worker	'{ "name" : "Jack", "age" : 27 }'
51*420d848fSAndroid Build Coastguard Worker
52*420d848fSAndroid Build Coastguard WorkerIt holds the following tokens:
53*420d848fSAndroid Build Coastguard Worker
54*420d848fSAndroid Build Coastguard Worker* Object: `{ "name" : "Jack", "age" : 27}` (the whole object)
55*420d848fSAndroid Build Coastguard Worker* Strings: `"name"`, `"Jack"`, `"age"` (keys and some values)
56*420d848fSAndroid Build Coastguard Worker* Number: `27`
57*420d848fSAndroid Build Coastguard Worker
58*420d848fSAndroid Build Coastguard WorkerIn jsmn, tokens do not hold any data, but point to token boundaries in JSON
59*420d848fSAndroid Build Coastguard Workerstring instead. In the example above jsmn will create tokens like: Object
60*420d848fSAndroid Build Coastguard Worker[0..31], String [3..7], String [12..16], String [20..23], Number [27..29].
61*420d848fSAndroid Build Coastguard Worker
62*420d848fSAndroid Build Coastguard WorkerEvery jsmn token has a type, which indicates the type of corresponding JSON
63*420d848fSAndroid Build Coastguard Workertoken. jsmn supports the following token types:
64*420d848fSAndroid Build Coastguard Worker
65*420d848fSAndroid Build Coastguard Worker* Object - a container of key-value pairs, e.g.:
66*420d848fSAndroid Build Coastguard Worker	`{ "foo":"bar", "x":0.3 }`
67*420d848fSAndroid Build Coastguard Worker* Array - a sequence of values, e.g.:
68*420d848fSAndroid Build Coastguard Worker	`[ 1, 2, 3 ]`
69*420d848fSAndroid Build Coastguard Worker* String - a quoted sequence of chars, e.g.: `"foo"`
70*420d848fSAndroid Build Coastguard Worker* Primitive - a number, a boolean (`true`, `false`) or `null`
71*420d848fSAndroid Build Coastguard Worker
72*420d848fSAndroid Build Coastguard WorkerBesides start/end positions, jsmn tokens for complex types (like arrays
73*420d848fSAndroid Build Coastguard Workeror objects) also contain a number of child items, so you can easily follow
74*420d848fSAndroid Build Coastguard Workerobject hierarchy.
75*420d848fSAndroid Build Coastguard Worker
76*420d848fSAndroid Build Coastguard WorkerThis approach provides enough information for parsing any JSON data and makes
77*420d848fSAndroid Build Coastguard Workerit possible to use zero-copy techniques.
78*420d848fSAndroid Build Coastguard Worker
79*420d848fSAndroid Build Coastguard WorkerUsage
80*420d848fSAndroid Build Coastguard Worker-----
81*420d848fSAndroid Build Coastguard Worker
82*420d848fSAndroid Build Coastguard WorkerDownload `jsmn.h`, include it, done.
83*420d848fSAndroid Build Coastguard Worker
84*420d848fSAndroid Build Coastguard Worker```
85*420d848fSAndroid Build Coastguard Worker#include "jsmn.h"
86*420d848fSAndroid Build Coastguard Worker
87*420d848fSAndroid Build Coastguard Worker...
88*420d848fSAndroid Build Coastguard Workerjsmn_parser p;
89*420d848fSAndroid Build Coastguard Workerjsmntok_t t[128]; /* We expect no more than 128 JSON tokens */
90*420d848fSAndroid Build Coastguard Worker
91*420d848fSAndroid Build Coastguard Workerjsmn_init(&p);
92*420d848fSAndroid Build Coastguard Workerr = jsmn_parse(&p, s, strlen(s), t, 128);
93*420d848fSAndroid Build Coastguard Worker```
94*420d848fSAndroid Build Coastguard Worker
95*420d848fSAndroid Build Coastguard WorkerSince jsmn is a single-header, header-only library, for more complex use cases
96*420d848fSAndroid Build Coastguard Workeryou might need to define additional macros. `#define JSMN_STATIC` hides all
97*420d848fSAndroid Build Coastguard Workerjsmn API symbols by making them static. Also, if you want to include `jsmn.h`
98*420d848fSAndroid Build Coastguard Workerfrom multiple C files, to avoid duplication of symbols you may define  `JSMN_HEADER` macro.
99*420d848fSAndroid Build Coastguard Worker
100*420d848fSAndroid Build Coastguard Worker```
101*420d848fSAndroid Build Coastguard Worker/* In every .c file that uses jsmn include only declarations: */
102*420d848fSAndroid Build Coastguard Worker#define JSMN_HEADER
103*420d848fSAndroid Build Coastguard Worker#include "jsmn.h"
104*420d848fSAndroid Build Coastguard Worker
105*420d848fSAndroid Build Coastguard Worker/* Additionally, create one jsmn.c file for jsmn implementation: */
106*420d848fSAndroid Build Coastguard Worker#include "jsmn.h"
107*420d848fSAndroid Build Coastguard Worker```
108*420d848fSAndroid Build Coastguard Worker
109*420d848fSAndroid Build Coastguard WorkerAPI
110*420d848fSAndroid Build Coastguard Worker---
111*420d848fSAndroid Build Coastguard Worker
112*420d848fSAndroid Build Coastguard WorkerToken types are described by `jsmntype_t`:
113*420d848fSAndroid Build Coastguard Worker
114*420d848fSAndroid Build Coastguard Worker	typedef enum {
115*420d848fSAndroid Build Coastguard Worker		JSMN_UNDEFINED = 0,
116*420d848fSAndroid Build Coastguard Worker		JSMN_OBJECT = 1,
117*420d848fSAndroid Build Coastguard Worker		JSMN_ARRAY = 2,
118*420d848fSAndroid Build Coastguard Worker		JSMN_STRING = 3,
119*420d848fSAndroid Build Coastguard Worker		JSMN_PRIMITIVE = 4
120*420d848fSAndroid Build Coastguard Worker	} jsmntype_t;
121*420d848fSAndroid Build Coastguard Worker
122*420d848fSAndroid Build Coastguard Worker**Note:** Unlike JSON data types, primitive tokens are not divided into
123*420d848fSAndroid Build Coastguard Workernumbers, booleans and null, because one can easily tell the type using the
124*420d848fSAndroid Build Coastguard Workerfirst character:
125*420d848fSAndroid Build Coastguard Worker
126*420d848fSAndroid Build Coastguard Worker* <code>'t', 'f'</code> - boolean
127*420d848fSAndroid Build Coastguard Worker* <code>'n'</code> - null
128*420d848fSAndroid Build Coastguard Worker* <code>'-', '0'..'9'</code> - number
129*420d848fSAndroid Build Coastguard Worker
130*420d848fSAndroid Build Coastguard WorkerToken is an object of `jsmntok_t` type:
131*420d848fSAndroid Build Coastguard Worker
132*420d848fSAndroid Build Coastguard Worker	typedef struct {
133*420d848fSAndroid Build Coastguard Worker		jsmntype_t type; // Token type
134*420d848fSAndroid Build Coastguard Worker		int start;       // Token start position
135*420d848fSAndroid Build Coastguard Worker		int end;         // Token end position
136*420d848fSAndroid Build Coastguard Worker		int size;        // Number of child (nested) tokens
137*420d848fSAndroid Build Coastguard Worker	} jsmntok_t;
138*420d848fSAndroid Build Coastguard Worker
139*420d848fSAndroid Build Coastguard Worker**Note:** string tokens point to the first character after
140*420d848fSAndroid Build Coastguard Workerthe opening quote and the previous symbol before final quote. This was made
141*420d848fSAndroid Build Coastguard Workerto simplify string extraction from JSON data.
142*420d848fSAndroid Build Coastguard Worker
143*420d848fSAndroid Build Coastguard WorkerAll job is done by `jsmn_parser` object. You can initialize a new parser using:
144*420d848fSAndroid Build Coastguard Worker
145*420d848fSAndroid Build Coastguard Worker	jsmn_parser parser;
146*420d848fSAndroid Build Coastguard Worker	jsmntok_t tokens[10];
147*420d848fSAndroid Build Coastguard Worker
148*420d848fSAndroid Build Coastguard Worker	jsmn_init(&parser);
149*420d848fSAndroid Build Coastguard Worker
150*420d848fSAndroid Build Coastguard Worker	// js - pointer to JSON string
151*420d848fSAndroid Build Coastguard Worker	// tokens - an array of tokens available
152*420d848fSAndroid Build Coastguard Worker	// 10 - number of tokens available
153*420d848fSAndroid Build Coastguard Worker	jsmn_parse(&parser, js, strlen(js), tokens, 10);
154*420d848fSAndroid Build Coastguard Worker
155*420d848fSAndroid Build Coastguard WorkerThis will create a parser, and then it tries to parse up to 10 JSON tokens from
156*420d848fSAndroid Build Coastguard Workerthe `js` string.
157*420d848fSAndroid Build Coastguard Worker
158*420d848fSAndroid Build Coastguard WorkerA non-negative return value of `jsmn_parse` is the number of tokens actually
159*420d848fSAndroid Build Coastguard Workerused by the parser.
160*420d848fSAndroid Build Coastguard WorkerPassing NULL instead of the tokens array would not store parsing results, but
161*420d848fSAndroid Build Coastguard Workerinstead the function will return the value of tokens needed to parse the given
162*420d848fSAndroid Build Coastguard Workerstring. This can be useful if you don't know yet how many tokens to allocate.
163*420d848fSAndroid Build Coastguard Worker
164*420d848fSAndroid Build Coastguard WorkerIf something goes wrong, you will get an error. Error will be one of these:
165*420d848fSAndroid Build Coastguard Worker
166*420d848fSAndroid Build Coastguard Worker* `JSMN_ERROR_INVAL` - bad token, JSON string is corrupted
167*420d848fSAndroid Build Coastguard Worker* `JSMN_ERROR_NOMEM` - not enough tokens, JSON string is too large
168*420d848fSAndroid Build Coastguard Worker* `JSMN_ERROR_PART` - JSON string is too short, expecting more JSON data
169*420d848fSAndroid Build Coastguard Worker
170*420d848fSAndroid Build Coastguard WorkerIf you get `JSMN_ERROR_NOMEM`, you can re-allocate more tokens and call
171*420d848fSAndroid Build Coastguard Worker`jsmn_parse` once more.  If you read json data from the stream, you can
172*420d848fSAndroid Build Coastguard Workerperiodically call `jsmn_parse` and check if return value is `JSMN_ERROR_PART`.
173*420d848fSAndroid Build Coastguard WorkerYou will get this error until you reach the end of JSON data.
174*420d848fSAndroid Build Coastguard Worker
175*420d848fSAndroid Build Coastguard WorkerOther info
176*420d848fSAndroid Build Coastguard Worker----------
177*420d848fSAndroid Build Coastguard Worker
178*420d848fSAndroid Build Coastguard WorkerThis software is distributed under [MIT license](http://www.opensource.org/licenses/mit-license.php),
179*420d848fSAndroid Build Coastguard Worker so feel free to integrate it in your commercial products.
180*420d848fSAndroid Build Coastguard Worker
181*420d848fSAndroid Build Coastguard Worker[1]: http://www.json.org/
182*420d848fSAndroid Build Coastguard Worker[2]: http://zserge.com/jsmn.html
183