[json-glib] reader: Add list_members() method



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]