14 if (parser->
toknext >= num_tokens) {
17 tok = &tokens[parser->
toknext++];
20#ifdef JSMN_PARENT_LINKS
41 size_t len,
jsmntok_t *tokens,
size_t num_tokens) {
47 for (; parser->
pos < len && js[parser->
pos] !=
'\0'; parser->
pos++) {
48 switch (js[parser->
pos]) {
53 case '\t' :
case '\r' :
case '\n' :
case ' ' :
54 case ',' :
case ']' :
case '}' :
57 if (js[parser->
pos] < 32 || js[parser->
pos] >= 127) {
79#ifdef JSMN_PARENT_LINKS
90 size_t len,
jsmntok_t *tokens,
size_t num_tokens) {
93 int start = parser->
pos;
98 for (; parser->
pos < len && js[parser->
pos] !=
'\0'; parser->
pos++) {
99 char c = js[parser->
pos];
103 if (tokens == NULL) {
112#ifdef JSMN_PARENT_LINKS
119 if (c ==
'\\' && parser->
pos + 1 < len) {
122 switch (js[parser->
pos]) {
124 case '\"':
case '/' :
case '\\' :
case 'b' :
125 case 'f' :
case 'r' :
case 'n' :
case 't' :
130 for(i = 0; i < 4 && parser->
pos < len && js[parser->
pos] !=
'\0'; i++) {
132 if(!((js[parser->
pos] >= 48 && js[parser->
pos] <= 57) ||
133 (js[parser->
pos] >= 65 && js[parser->
pos] <= 70) ||
134 (js[parser->
pos] >= 97 && js[parser->
pos] <= 102))) {
157 jsmntok_t *tokens,
unsigned int num_tokens) {
163 for (; parser->
pos < len && js[parser->
pos] !=
'\0'; parser->
pos++) {
171 if (tokens == NULL) {
179#ifdef JSMN_PARENT_LINKS
191#ifdef JSMN_PARENT_LINKS
195 token = &tokens[parser->
toknext - 1];
197 if (token->
start != -1 && token->
end == -1) {
198 if (token->
type != type) {
201 token->
end = parser->
pos + 1;
205 if (token->
parent == -1) {
208 token = &tokens[token->
parent];
211 for (i = parser->
toknext - 1; i >= 0; i--) {
213 if (token->
start != -1 && token->
end == -1) {
214 if (token->
type != type) {
218 token->
end = parser->
pos + 1;
224 for (; i >= 0; i--) {
226 if (token->
start != -1 && token->
end == -1) {
237 if (parser->
toksuper != -1 && tokens != NULL)
240 case '\t' :
case '\r' :
case '\n' :
case ' ':
246 if (tokens != NULL && parser->
toksuper != -1 &&
249#ifdef JSMN_PARENT_LINKS
252 for (i = parser->
toknext - 1; i >= 0; i--) {
254 if (tokens[i].start != -1 && tokens[i].end == -1) {
265 case '-':
case '0':
case '1' :
case '2':
case '3' :
case '4':
266 case '5':
case '6':
case '7' :
case '8':
case '9':
267 case 't':
case 'f':
case 'n' :
269 if (tokens != NULL && parser->
toksuper != -1) {
283 if (parser->
toksuper != -1 && tokens != NULL)
295 if (tokens != NULL) {
296 for (i = parser->
toknext - 1; i >= 0; i--) {
298 if (tokens[i].start != -1 && tokens[i].end == -1) {
318 if (!tokens || startToken < 0)
return 0;
321 while (tokens[n].parent >= 0) {
329 if (!tokens || !tokenCount || !key)
return -1;
332 int keyLen = (int)strlen(key);
333 if (!keyLen)
return -1;
335 for (
int n = 0; n<tokenCount - 1; n++) {
337 if (parent != tokens[n].parent)
339 if (keyLen == tokens[n].end - tokens[n].start && strncmp(json + tokens[n].start, key, keyLen) == 0) {
349 if (!tokens || !tokenCount || (token < 0) || (token >= tokenCount))
return NULL;
350 valLength = tokens[token].
end - tokens[token].
start;
351 return json + tokens[token].
start;
356 const char* str =
GetJSONValue(tokens, tokenCount, json, token, len);
359 return std::string(str, len);
377 if (!tokens || !tokenCount || !key)
return NULL;
380 int keyLen = (int) strlen(key);
381 if (!keyLen)
return NULL;
383 for (
int n=0; n<tokenCount-1; n++) {
385 if (keyLen == tokens[n].end - tokens[n].start && strncmp(json + tokens[n].start, key, keyLen) == 0) {
388 if (instance && (++inst) != instance)
390 valLength = tokens[n+1].
end - tokens[n+1].
start;
391 return json + tokens[n+1].
start;
400 if (!tokens || !tokenCount || !key)
return NULL;
403 int keyLen = (int)strlen(key);
404 if (!keyLen)
return NULL;
406 for (
int n = 0; n<tokenCount - 1; n++) {
408 if (parent != tokens[n].parent)
410 if (keyLen == tokens[n].end - tokens[n].start && strncmp(json + tokens[n].start, key, keyLen) == 0) {
411 valLength = tokens[n + 1].
end - tokens[n + 1].
start;
412 return json + tokens[n + 1].
start;
422 const char* str =
GetJSONValue(tokens, tokenCount, json, key, type, len, level, instance);
425 return std::string(str, len);
443 const char* str =
GetJSONChildValue(tokens, tokenCount, json, key, parent, type, len);
446 return std::string(str, len);
465 std::vector<int> indexes;
467 if (!tokens || !tokenCount || !key)
return indexes;
470 int keyLen = (int) strlen(key);
471 if (!keyLen)
return indexes;
473 for (
int n=0; n<tokenCount-1; n++) {
475 if (keyLen == tokens[n].end - tokens[n].start && strncmp(json + tokens[n].start, key, keyLen) == 0) {
478 if (instance && (++inst) != instance)
481 for (
int m=n+2; m<tokenCount-1; m++) {
482 if (tokens[m].parent == n+1)
483 indexes.push_back(m);
493 std::vector<int> indexes;
495 if (!tokens || !tokenCount || !key)
return indexes;
498 int keyLen = (int)strlen(key);
499 if (!keyLen)
return indexes;
501 for (
int n = 0; n<tokenCount - 1; n++) {
503 if (parent != tokens[n].parent)
505 if (keyLen == tokens[n].end - tokens[n].start && strncmp(json + tokens[n].start, key, keyLen) == 0) {
507 for (
int m = n + 2; m<tokenCount - 1; m++) {
508 if (tokens[m].parent == n + 1)
509 indexes.push_back(m);
520 std::vector<int> indexes;
522 if (!tokens || !tokenCount)
return indexes;
524 if ((parent < 0) || (parent >= tokenCount))
return indexes;
528 for (
int n = 0; n<tokenCount - 1; n++) {
530 if (parent == tokens[n].parent+1) {
531 indexes.push_back(n);
540 if (!json || !strlen(json))
548 std::string fullJSON = json;
549 return utils::StringFormat(
"%s,%s}", fullJSON.substr(0, lastBracket - json).c_str(), subJSON);
const char * laststrstr(const char *str1, const char *str2)
Find the last occurrence of str2 in str1.
std::string StringFormat(const char *format,...)
printf into a std::string.
uint64 Ascii2Uint64(const char *ascii, uint32 start=0, uint32 end=0)
Parse an unsigned 64-bit decimal integer from a substring.
int64 Ascii2Int64(const char *ascii, uint32 start=0, uint32 end=0)
Parse a signed 64-bit decimal integer from a substring.
float64 Ascii2Float64(const char *ascii, uint32 start=0, uint32 end=0)
Parse a 64-bit float from a substring (decimal point, not locale dependent).
const char * GetJSONValue(jsmntok_t *tokens, int tokenCount, const char *json, int token, int &valLength)
std::vector< int > GetJSONChildArrayIndexes(jsmntok_t *tokens, int tokenCount, const char *json, const char *key, int parent, jsmntype_t type)
static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, int start, int end)
Fills token type and boundaries.
const char * GetJSONChildValue(jsmntok_t *tokens, int tokenCount, const char *json, const char *key, int parent, jsmntype_t type, int &valLength)
int GetJSONToken(jsmntok_t *tokens, int tokenCount, const char *json, const char *key, int parent, jsmntype_t type)
static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, size_t num_tokens)
Fills next available token with JSON primitive.
static jsmntok_t * jsmn_alloc_token(jsmn_parser *parser, jsmntok_t *tokens, size_t num_tokens)
Allocates a fresh unused token from the token pull.
std::vector< int > GetJSONArrayIndexes(jsmntok_t *tokens, int tokenCount, const char *json, const char *key, jsmntype_t type, int level, int instance)
static int jsmn_parse_string(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, size_t num_tokens)
Filsl next token with JSON string.
std::string GetJSONValueString(jsmntok_t *tokens, int tokenCount, const char *json, int token)
std::string GetJSONChildValueString(jsmntok_t *tokens, int tokenCount, const char *json, const char *key, int parent, jsmntype_t type)
int GetJSONTokenLevel(jsmntok_t *tokens, int startToken)
uint64 GetJSONValueUint64(jsmntok_t *tokens, int tokenCount, const char *json, int token)
int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, unsigned int num_tokens)
Parse JSON string and fill tokens.
void jsmn_init(jsmn_parser *parser)
Creates a new parser based over a given buffer with an array of tokens available.
float64 GetJSONChildValueFloat64(jsmntok_t *tokens, int tokenCount, const char *json, const char *key, int parent, jsmntype_t type)
int64 GetJSONChildValueInt64(jsmntok_t *tokens, int tokenCount, const char *json, const char *key, int parent, jsmntype_t type)
std::string AddToJSONRoot(const char *json, const char *subJSON)
uint64 GetJSONChildValueUint64(jsmntok_t *tokens, int tokenCount, const char *json, const char *key, int parent, jsmntype_t type)
int64 GetJSONValueInt64(jsmntok_t *tokens, int tokenCount, const char *json, int token)
float64 GetJSONValueFloat64(jsmntok_t *tokens, int tokenCount, const char *json, int token)
Third-party (vendored): jsmn minimalistic JSON tokenizer by Serge Zaitsev (MIT licence),...
jsmntype_t
JSON type identifier.