summaryrefslogtreecommitdiff
path: root/json-glib/json-reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'json-glib/json-reader.c')
-rw-r--r--json-glib/json-reader.c67
1 files changed, 51 insertions, 16 deletions
diff --git a/json-glib/json-reader.c b/json-glib/json-reader.c
index 5c2c00c..8262def 100644
--- a/json-glib/json-reader.c
+++ b/json-glib/json-reader.c
@@ -410,8 +410,8 @@ json_reader_is_value (JsonReader *reader)
* @reader: a #JsonReader
* @index_: the index of the element
*
- * Advances the cursor of @reader to the element @index_ of array at the
- * current position.
+ * Advances the cursor of @reader to the element @index_ of the array
+ * or the object at the current position.
*
* You can use the json_reader_get_value* family of functions to retrieve
* the value of the element; for instance:
@@ -434,9 +434,9 @@ json_reader_is_value (JsonReader *reader)
* json_reader_end_element (reader);
* ]|
*
- * If @reader is not currently on an array, or if the @index_ is bigger than
- * the size of the array, the #JsonReader will be put in an error state until
- * json_reader_end_element() is called.
+ * If @reader is not currently on an array or an object, or if the @index_ is
+ * bigger than the size of the array or the object, the #JsonReader will be
+ * put in an error state until json_reader_end_element() is called.
*
* Return value: %TRUE on success, and %FALSE otherwise
*
@@ -447,7 +447,6 @@ json_reader_read_element (JsonReader *reader,
guint index_)
{
JsonReaderPrivate *priv;
- JsonArray *array;
g_return_val_if_fail (JSON_READER (reader), FALSE);
json_reader_return_val_if_error_set (reader, FALSE);
@@ -457,21 +456,57 @@ json_reader_read_element (JsonReader *reader,
if (priv->current_node == NULL)
priv->current_node = priv->root;
- if (!JSON_NODE_HOLDS_ARRAY (priv->current_node))
+ if (!(JSON_NODE_HOLDS_ARRAY (priv->current_node) ||
+ JSON_NODE_HOLDS_OBJECT (priv->current_node)))
return json_reader_set_error (reader, JSON_READER_ERROR_NO_ARRAY,
"The current node is of type '%s', but "
- "an array was expected.",
+ "an array or an object was expected.",
json_node_type_name (priv->current_node));
- array = json_node_get_array (priv->current_node);
- if (index_ >= json_array_get_length (array))
- return json_reader_set_error (reader, JSON_READER_ERROR_INVALID_INDEX,
- "The index '%d' is greater than the size "
- "of the array at the current position.",
- index_);
+ switch (json_node_get_node_type (priv->current_node))
+ {
+ case JSON_NODE_ARRAY:
+ {
+ JsonArray *array = json_node_get_array (priv->current_node);
+
+ if (index_ >= json_array_get_length (array))
+ return json_reader_set_error (reader, JSON_READER_ERROR_INVALID_INDEX,
+ "The index '%d' is greater than the size "
+ "of the array at the current position.",
+ index_);
+
+ priv->previous_node = priv->current_node;
+ priv->current_node = json_array_get_element (array, index_);
+ }
+ break;
- priv->previous_node = priv->current_node;
- priv->current_node = json_array_get_element (array, index_);
+ case JSON_NODE_OBJECT:
+ {
+ JsonObject *object = json_node_get_object (priv->current_node);
+ GList *members;
+ const gchar *name;
+
+ if (index_ >= json_object_get_size (object))
+ return json_reader_set_error (reader, JSON_READER_ERROR_INVALID_INDEX,
+ "The index '%d' is greater than the size "
+ "of the object at the current position.",
+ index_);
+
+ priv->previous_node = priv->current_node;
+
+ members = json_object_get_members (object);
+ name = g_list_nth_data (members, index_);
+
+ priv->current_node = json_object_get_member (object, name);
+
+ g_list_free (members);
+ }
+ break;
+
+ default:
+ g_assert_not_reached ();
+ return FALSE;
+ }
return TRUE;
}