1*420d848fSAndroid Build Coastguard WorkerJSMN 2*420d848fSAndroid Build Coastguard Worker==== 3*420d848fSAndroid Build Coastguard Worker 4*420d848fSAndroid Build Coastguard Worker[](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