[json-glib] reader: Add list_members() method
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [json-glib] reader: Add list_members() method
- Date: Sun, 6 Feb 2011 12:23:43 +0000 (UTC)
commit 74ed11db6da9839ce17b448d6d17103ea0734dda
Author: Emmanuele Bassi <ebassi linux intel com>
Date: Fri Feb 4 19:18:22 2011 +0000
reader: Add list_members() method
Allow retrieving a list of member names from the current cursor position
of the JsonReader. It's useful if you're trying to inspect a JSON tree.
doc/reference/json-glib-sections.txt | 1 +
json-glib/json-glib.symbols | 1 +
json-glib/json-reader.c | 46 ++++++++++++++++++++++++++++++++++
json-glib/json-reader.h | 1 +
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");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]