diff options
-rw-r--r-- | doc/reference/json-glib-sections.txt | 1 | ||||
-rw-r--r-- | json-glib/json-glib.symbols | 1 | ||||
-rw-r--r-- | json-glib/json-reader.c | 46 | ||||
-rw-r--r-- | json-glib/json-reader.h | 1 | ||||
-rw-r--r-- | json-glib/tests/reader-test.c | 19 |
5 files changed, 68 insertions, 0 deletions
diff --git a/doc/reference/json-glib-sections.txt b/doc/reference/json-glib-sections.txt index 4ffeaa6..9d3bacb 100644 --- a/doc/reference/json-glib-sections.txt +++ b/doc/reference/json-glib-sections.txt @@ -329,6 +329,7 @@ json_reader_read_member json_reader_end_member json_reader_is_object json_reader_count_members +json_reader_list_members <SUBSECTION> json_reader_is_value json_reader_get_value diff --git a/json-glib/json-glib.symbols b/json-glib/json-glib.symbols index 4420c6a..06d0f63 100644 --- a/json-glib/json-glib.symbols +++ b/json-glib/json-glib.symbols @@ -146,6 +146,7 @@ json_reader_get_null_value json_reader_get_string_value
json_reader_get_type
json_reader_get_value
+json_reader_list_members
json_reader_is_array
json_reader_is_object
json_reader_is_value
diff --git a/json-glib/json-reader.c b/json-glib/json-reader.c index cde828d..5c2c00c 100644 --- a/json-glib/json-reader.c +++ b/json-glib/json-reader.c @@ -643,6 +643,52 @@ json_reader_end_member (JsonReader *reader) } /** + * json_reader_list_members: + * @reader: a #JsonReader + * + * Retrieves a list of member names from the current position, if @reader + * is positioned on an object. + * + * Return value: (transfer full): a newly allocated, %NULL-terminated + * array of strings holding the members name. Use g_strfreev() when + * done. + * + * Since: 0.14 + */ +gchar ** +json_reader_list_members (JsonReader *reader) +{ + JsonReaderPrivate *priv; + GList *members, *l; + gchar **retval; + gint i; + + g_return_val_if_fail (JSON_IS_READER (reader), NULL); + + priv = reader->priv; + + if (priv->current_node == NULL) + return NULL; + + if (!JSON_NODE_HOLDS_OBJECT (priv->current_node)) + return NULL; + + members = json_object_get_members (json_node_get_object (priv->current_node)); + if (members == NULL) + return NULL; + + retval = g_new (gchar*, g_list_length (members) + 1); + for (l = members, i = 0; l != NULL; l = l->next, i += 1) + retval[i] = g_strdup (l->data); + + retval[i] = NULL; + + g_list_free (members); + + return retval; +} + +/** * json_reader_count_members: * @reader: a #JsonReader * diff --git a/json-glib/json-reader.h b/json-glib/json-reader.h index a018195..d6d39fb 100644 --- a/json-glib/json-reader.h +++ b/json-glib/json-reader.h @@ -126,6 +126,7 @@ gboolean json_reader_read_member (JsonReader *reader, const gchar *member_name); void json_reader_end_member (JsonReader *reader); gint json_reader_count_members (JsonReader *reader); +gchar ** json_reader_list_members (JsonReader *reader); gboolean json_reader_is_value (JsonReader *reader); JsonNode * json_reader_get_value (JsonReader *reader); diff --git a/json-glib/tests/reader-test.c b/json-glib/tests/reader-test.c index b0990b8..7eb982f 100644 --- a/json-glib/tests/reader-test.c +++ b/json-glib/tests/reader-test.c @@ -11,12 +11,20 @@ static const gchar *test_base_array_data = static const gchar *test_base_object_data = "{ \"text\" : \"hello, world!\", \"foo\" : \"bar\", \"blah\" : 47 }"; +static const gchar *expected_member_name[] = { + "text", + "foo", + "blah" +}; + static void test_base_object (void) { JsonParser *parser = json_parser_new (); JsonReader *reader = json_reader_new (NULL); GError *error = NULL; + gchar **members; + gsize n_members, i; json_parser_load_from_data (parser, test_base_object_data, -1, &error); g_assert (error == NULL); @@ -26,6 +34,17 @@ test_base_object (void) g_assert (json_reader_is_object (reader)); g_assert_cmpint (json_reader_count_members (reader), ==, 3); + members = json_reader_list_members (reader); + g_assert (members != NULL); + + n_members = g_strv_length (members); + g_assert_cmpint (n_members, ==, json_reader_count_members (reader)); + + for (i = 0; i < n_members; i++) + g_assert_cmpstr (members[i], ==, expected_member_name[i]); + + g_strfreev (members); + g_assert (json_reader_read_member (reader, "foo")); g_assert (json_reader_is_value (reader)); g_assert_cmpstr (json_reader_get_string_value (reader), ==, "bar"); |