-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a json_set_serializer() function to allow the string output of a …
…json_object to be customized.
- Loading branch information
Showing
8 changed files
with
214 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#include <assert.h> | ||
#include <stdio.h> | ||
#include <string.h> | ||
|
||
#include "json.h" | ||
#include "printbuf.h" | ||
|
||
struct myinfo { | ||
int value; | ||
}; | ||
|
||
static int freeit_was_called = 0; | ||
static void freeit(json_object *jso, void *userdata) | ||
{ | ||
struct myinfo *info = userdata; | ||
printf("freeit, value=%d\n", info->value); | ||
// Don't actually free anything here, the userdata is stack allocated. | ||
freeit_was_called = 1; | ||
} | ||
static int custom_serializer(struct json_object *o, | ||
struct printbuf *pb, | ||
int level, | ||
int flags) | ||
{ | ||
sprintbuf(pb, "Custom Output"); | ||
return 0; | ||
} | ||
|
||
int main(int argc, char **argv) | ||
{ | ||
json_object *my_object; | ||
|
||
MC_SET_DEBUG(1); | ||
|
||
printf("Test setting, then resetting a custom serializer:\n"); | ||
my_object = json_object_new_object(); | ||
json_object_object_add(my_object, "abc", json_object_new_int(12)); | ||
json_object_object_add(my_object, "foo", json_object_new_string("bar")); | ||
|
||
printf("my_object.to_string(standard)=%s\n", json_object_to_json_string(my_object)); | ||
|
||
struct myinfo userdata = { .value = 123 }; | ||
json_object_set_serializer(my_object, custom_serializer, &userdata, freeit); | ||
|
||
printf("my_object.to_string(custom serializer)=%s\n", json_object_to_json_string(my_object)); | ||
|
||
printf("Next line of output should be from the custom freeit function:\n"); | ||
freeit_was_called = 0; | ||
json_object_set_serializer(my_object, NULL, NULL, NULL); | ||
assert(freeit_was_called); | ||
|
||
printf("my_object.to_string(standard)=%s\n", json_object_to_json_string(my_object)); | ||
|
||
json_object_put(my_object); | ||
|
||
// ============================================ | ||
|
||
my_object = json_object_new_object(); | ||
printf("Check that the custom serializer isn't free'd until the last json_object_put:\n"); | ||
json_object_set_serializer(my_object, custom_serializer, &userdata, freeit); | ||
json_object_get(my_object); | ||
json_object_put(my_object); | ||
printf("my_object.to_string(custom serializer)=%s\n", json_object_to_json_string(my_object)); | ||
printf("Next line of output should be from the custom freeit function:\n"); | ||
|
||
freeit_was_called = 0; | ||
json_object_put(my_object); | ||
assert(freeit_was_called); | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
my_object.to_string(standard)={ "abc": 12, "foo": "bar" } | ||
my_object.to_string(custom serializer)=Custom Output | ||
Next line of output should be from the custom freeit function: | ||
freeit, value=123 | ||
my_object.to_string(standard)={ "abc": 12, "foo": "bar" } | ||
Check that the custom serializer isn't free'd until the last json_object_put: | ||
my_object.to_string(custom serializer)=Custom Output | ||
Next line of output should be from the custom freeit function: | ||
freeit, value=123 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
#!/bin/sh | ||
|
||
# Common definitions | ||
if test -z "$srcdir"; then | ||
srcdir="${0%/*}" | ||
test "$srcdir" = "$0" && srcdir=. | ||
test -z "$srcdir" && srcdir=. | ||
fi | ||
. "$srcdir/test-defs.sh" | ||
|
||
run_output_test test_set_serializer | ||
exit $? |