summaryrefslogtreecommitdiff
path: root/json-glib/json-generator.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@openedhand.com>2007-10-02 08:07:56 +0100
committerEmmanuele Bassi <ebassi@openedhand.com>2007-10-02 08:07:56 +0100
commit2b25dbfa802f9af6e76fbe72140b687535cae8e5 (patch)
treea83bfd10aad177242ce949d2f822cd642162fd71 /json-glib/json-generator.c
parent326cdead6f1c7b1bbaae0961d28bfe5ca3af0a1a (diff)
downloadjson-glib-2b25dbfa802f9af6e76fbe72140b687535cae8e5.tar.gz
Add objects support
JsonGenerator can now create objects and array-nested objects, with and without pretty printing. The test suite has been updated accordingly.
Diffstat (limited to 'json-glib/json-generator.c')
-rw-r--r--json-glib/json-generator.c125
1 files changed, 122 insertions, 3 deletions
diff --git a/json-glib/json-generator.c b/json-glib/json-generator.c
index df3bf55..1395ee2 100644
--- a/json-glib/json-generator.c
+++ b/json-glib/json-generator.c
@@ -53,6 +53,21 @@ enum
PROP_INDENT
};
+static gchar *dump_value (JsonGenerator *generator,
+ gint level,
+ const gchar *name,
+ JsonNode *node);
+static gchar *dump_array (JsonGenerator *generator,
+ gint level,
+ const gchar *name,
+ JsonArray *array,
+ gsize *length);
+static gchar *dump_object (JsonGenerator *generator,
+ gint level,
+ const gchar *name,
+ JsonObject *object,
+ gsize *length);
+
G_DEFINE_TYPE (JsonGenerator, json_generator, G_TYPE_OBJECT);
static void
@@ -164,6 +179,7 @@ json_generator_init (JsonGenerator *generator)
static gchar *
dump_value (JsonGenerator *generator,
gint level,
+ const gchar *name,
JsonNode *node)
{
gboolean pretty = generator->priv->pretty;
@@ -180,6 +196,9 @@ dump_value (JsonGenerator *generator,
g_string_append_c (buffer, ' ');
}
+ if (name && name[0] != '\0')
+ g_string_append_printf (buffer, "\"%s\" : ", name);
+
json_node_get_value (node, &value);
switch (G_VALUE_TYPE (&value))
@@ -213,6 +232,7 @@ dump_value (JsonGenerator *generator,
static gchar *
dump_array (JsonGenerator *generator,
gint level,
+ const gchar *name,
JsonArray *array,
gsize *length)
{
@@ -230,6 +250,9 @@ dump_array (JsonGenerator *generator,
g_string_append_c (buffer, ' ');
}
+ if (name && name[0] != '\0')
+ g_string_append_printf (buffer, "\"%s\" : ", name);
+
g_string_append_c (buffer, '[');
if (pretty)
@@ -256,16 +279,18 @@ dump_array (JsonGenerator *generator,
break;
case JSON_NODE_VALUE:
- value = dump_value (generator, sub_level, cur);
+ value = dump_value (generator, sub_level, NULL, cur);
g_string_append (buffer, value);
break;
case JSON_NODE_ARRAY:
- value = dump_array (generator, sub_level, json_node_get_array (cur), NULL);
+ value = dump_array (generator, sub_level, NULL, json_node_get_array (cur), NULL);
g_string_append (buffer, value);
break;
case JSON_NODE_OBJECT:
+ value = dump_object (generator, sub_level, NULL, json_node_get_object (cur), NULL);
+ g_string_append (buffer, value);
break;
}
@@ -292,6 +317,99 @@ dump_array (JsonGenerator *generator,
return g_string_free (buffer, FALSE);
}
+static gchar *
+dump_object (JsonGenerator *generator,
+ gint level,
+ const gchar *name,
+ JsonObject *object,
+ gsize *length)
+{
+ GList *members, *l;
+ GString *buffer;
+ gboolean pretty = generator->priv->pretty;
+ guint indent = generator->priv->indent;
+ gint i;
+
+ buffer = g_string_new ("");
+
+ if (pretty)
+ {
+ for (i = 0; i < (level * indent); i++)
+ g_string_append_c (buffer, ' ');
+ }
+
+ if (name && name[0] != '\0')
+ g_string_append_printf (buffer, "\"%s\" : ", name);
+
+ g_string_append_c (buffer, '{');
+
+ if (pretty)
+ g_string_append_c (buffer, '\n');
+ else
+ g_string_append_c (buffer, ' ');
+
+ members = json_object_get_members (object);
+
+ for (l = members; l != NULL; l = l->next)
+ {
+ const gchar *name = l->data;
+ JsonNode *cur = json_object_get_member (object, name);
+ guint sub_level = level + 1;
+ gint j;
+ gchar *value;
+
+ switch (JSON_NODE_TYPE (cur))
+ {
+ case JSON_NODE_NULL:
+ if (pretty)
+ {
+ for (j = 0; j < (sub_level * indent); j++)
+ g_string_append_c (buffer, ' ');
+ }
+ g_string_append_printf (buffer, "\"%s\" : null", name);
+ break;
+
+ case JSON_NODE_VALUE:
+ value = dump_value (generator, sub_level, name, cur);
+ g_string_append (buffer, value);
+ break;
+
+ case JSON_NODE_ARRAY:
+ value = dump_array (generator, sub_level, name, json_node_get_array (cur), NULL);
+ g_string_append (buffer, value);
+ break;
+
+ case JSON_NODE_OBJECT:
+ value = dump_object (generator, sub_level, name, json_node_get_object (cur), NULL);
+ g_string_append (buffer, value);
+ break;
+ }
+
+ if (l->next != NULL)
+ g_string_append_c (buffer, ',');
+
+ if (pretty)
+ g_string_append_c (buffer, '\n');
+ else
+ g_string_append_c (buffer, ' ');
+ }
+
+ g_list_free (members);
+
+ if (pretty)
+ {
+ for (i = 0; i < (level * indent); i++)
+ g_string_append_c (buffer, ' ');
+ }
+
+ g_string_append_c (buffer, '}');
+
+ if (length)
+ *length = buffer->len;
+
+ return g_string_free (buffer, FALSE);
+}
+
/**
* json_generator_new:
*
@@ -339,10 +457,11 @@ json_generator_to_data (JsonGenerator *generator,
switch (JSON_NODE_TYPE (root))
{
case JSON_NODE_ARRAY:
- retval = dump_array (generator, 0, json_node_get_array (root), length);
+ retval = dump_array (generator, 0, NULL, json_node_get_array (root), length);
break;
case JSON_NODE_OBJECT:
+ retval = dump_object (generator, 0, NULL, json_node_get_object (root), length);
break;
case JSON_NODE_NULL: