This commit is contained in:
Nicolas Mora 2015-12-30 21:31:24 +00:00
commit 0cd282c580
4 changed files with 138 additions and 2 deletions

View File

@ -1,9 +1,10 @@
EXTRA_PROGRAMS = simple_parse
EXTRA_PROGRAMS = simple_parse simple_search
simple_parse_SOURCES = simple_parse.c
simple_search_SOURCES = simple_search.c
AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src
LDFLAGS = -static # for easier running
LDADD = $(top_builddir)/src/libjansson.la
all: simple_parse
all: simple_parse simple_search

82
examples/simple_search.c Normal file
View File

@ -0,0 +1,82 @@
#include <stdio.h>
#include <stdlib.h>
#include <jansson.h>
char * str_haystack = "{\
\"haystack\": \"full of hay\",\
\"keystr\": \"valuestr\",\
\"keyint\": 1234,\
\"keyreal\": 12.34,\
\"keyobject\": {\
\"name\": \"innerObject\",\
\"otherKey\": \"otherValue\",\
\"otherInt\": 778,\
\"needle2\": \"waldo2\",\
\"needle5\": [\
\"waldo5\", \"waldo6\", \"waldo7\"\
]\
},\
\"keyarray\": [\
{\
\"name\": \"innerObjectInArray\",\
\"otherKey\": \"otherValue\",\
\"otherInt\": 778,\
\"needle3\": 92536\
},\
543,\
\"innerString\",\
{\
\"needle4\": \"waldo4\",\
\"needle4key2\": 432\
}\
],\
\"needle1\": \"waldo1\"\
}";
int main() {
json_t * j_haystack = json_loads(str_haystack, JSON_DECODE_ANY, NULL);
json_t * j_needle1 = json_string("waldo1");
json_t * j_needle2 = json_string("waldo2");
json_t * j_needle3 = json_integer(92536);
json_t * j_needle4 = json_pack("{sssi}", "needle4", "waldo4", "needle4key2", json_integer(432));
json_t * j_needle5 = json_pack("[sss]", "waldo5", "waldo6", "waldo7");
json_t * j_needle_none = json_pack("{ss}", "needle4", "waldo4");
if (json_search(j_haystack, j_needle1) != NULL) {
printf("needle %s found\n", json_dumps(j_needle1, JSON_ENCODE_ANY));
} else {
printf("needle %s not found\n", json_dumps(j_needle1, JSON_ENCODE_ANY));
}
if (json_search(j_haystack, j_needle2) != NULL) {
printf("needle %s found\n", json_dumps(j_needle2, JSON_ENCODE_ANY));
} else {
printf("needle %s not found\n", json_dumps(j_needle2, JSON_ENCODE_ANY));
}
if (json_search(j_haystack, j_needle3) != NULL) {
printf("needle %s found\n", json_dumps(j_needle3, JSON_ENCODE_ANY));
} else {
printf("needle %s not found\n", json_dumps(j_needle3, JSON_ENCODE_ANY));
}
if (json_search(j_haystack, j_needle4) != NULL) {
printf("needle %s found\n", json_dumps(j_needle4, JSON_ENCODE_ANY));
} else {
printf("needle %s not found\n", json_dumps(j_needle4, JSON_ENCODE_ANY));
}
if (json_search(j_haystack, j_needle5) != NULL) {
printf("needle %s found\n", json_dumps(j_needle5, JSON_ENCODE_ANY));
} else {
printf("needle %s not found\n", json_dumps(j_needle5, JSON_ENCODE_ANY));
}
if (json_search(j_haystack, j_needle_none) != NULL) {
printf("needle %s found\n", json_dumps(j_needle_none, JSON_ENCODE_ANY));
} else {
printf("needle %s not found\n", json_dumps(j_needle_none, JSON_ENCODE_ANY));
}
return 0;
}

View File

@ -240,6 +240,9 @@ int json_vunpack_ex(json_t *root, json_error_t *error, size_t flags, const char
int json_equal(json_t *value1, json_t *value2);
/* search */
json_t * json_search(json_t * haystack, json_t * needle);
/* copying */

View File

@ -982,6 +982,56 @@ int json_equal(json_t *json1, json_t *json2)
return 0;
}
/*** search ***/
/**
* Look for an occurence of needle within haystack
* If needle is present in haystack, return the reference to the json_t * that is equal to needle
* If needle is not found, return NULL
*/
json_t * json_search(json_t * haystack, json_t * needle) {
json_t * value1, * value2;
size_t index;
const char * key;
if (!haystack || !needle)
return NULL;
if (haystack == needle)
return haystack;
// If both haystack and needle are the same type, test them
if (json_typeof(haystack) == json_typeof(needle))
if (json_equal(haystack, needle))
return haystack;
// If they are not equals, test json_search in haystack elements recursively if it's an array or an object
if (json_is_array(haystack)) {
json_array_foreach(haystack, index, value1) {
if (json_equal(value1, needle)) {
return value1;
} else {
value2 = json_search(value1, needle);
if (value2 != NULL) {
return value2;
}
}
}
} else if (json_is_object(haystack)) {
json_object_foreach(haystack, key, value1) {
if (json_equal(value1, needle)) {
return value1;
} else {
value2 = json_search(value1, needle);
if (value2 != NULL) {
return value2;
}
}
}
}
return NULL;
}
/*** copying ***/