summaryrefslogtreecommitdiff
path: root/json-glib/json-parser.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@openedhand.com>2007-10-10 12:03:59 +0100
committerEmmanuele Bassi <ebassi@openedhand.com>2007-10-10 12:03:59 +0100
commitb3ecd6e2fbdd58250427f406c43d60b8cb8d2644 (patch)
treebd6ad7ddd08c5f3f7e8cdf1657eaa7d5e1c6b342 /json-glib/json-parser.c
parenta7839a06da53d32eb372b4813e5883a04e1c36b7 (diff)
downloadjson-glib-b3ecd6e2fbdd58250427f406c43d60b8cb8d2644.tar.gz
Parse bare root values
If the root node contains just a bare value (true, false, null, fundamental type) then it's still valid JSON. Also, use the commodity JsonNode API to avoid using values in the parser code.
Diffstat (limited to 'json-glib/json-parser.c')
-rw-r--r--json-glib/json-parser.c79
1 files changed, 29 insertions, 50 deletions
diff --git a/json-glib/json-parser.c b/json-glib/json-parser.c
index 2f9e24c..19ff5c8 100644
--- a/json-glib/json-parser.c
+++ b/json-glib/json-parser.c
@@ -343,7 +343,6 @@ json_parse_array (JsonParser *parser,
while (token != G_TOKEN_RIGHT_BRACE)
{
JsonNode *node = NULL;
- GValue value = { 0, };
if (token == G_TOKEN_COMMA)
{
@@ -421,44 +420,25 @@ json_parse_array (JsonParser *parser,
switch (token)
{
case G_TOKEN_INT:
- g_value_init (&value, G_TYPE_INT);
- g_value_set_int (&value, scanner->value.v_int);
-
node = json_node_new (JSON_NODE_VALUE);
- json_node_set_value (node, &value);
-
- g_value_unset (&value);
+ json_node_set_int (node, scanner->value.v_int);
break;
case G_TOKEN_FLOAT:
- g_value_init (&value, G_TYPE_DOUBLE);
- g_value_set_double (&value, scanner->value.v_float);
-
node = json_node_new (JSON_NODE_VALUE);
- json_node_set_value (node, &value);
-
- g_value_unset (&value);
+ json_node_set_double (node, scanner->value.v_float);
break;
case G_TOKEN_STRING:
- g_value_init (&value, G_TYPE_STRING);
- g_value_set_string (&value, scanner->value.v_string);
-
node = json_node_new (JSON_NODE_VALUE);
- json_node_set_value (node, &value);
-
- g_value_unset (&value);
+ json_node_set_string (node, scanner->value.v_string);
break;
case JSON_TOKEN_TRUE:
case JSON_TOKEN_FALSE:
- g_value_init (&value, G_TYPE_BOOLEAN);
- g_value_set_boolean (&value, token == JSON_TOKEN_TRUE ? TRUE : FALSE);
-
node = json_node_new (JSON_NODE_VALUE);
- json_node_set_value (node, &value);
-
- g_value_unset (&value);
+ json_node_set_boolean (node, token == JSON_TOKEN_TRUE ? TRUE
+ : FALSE);
break;
case JSON_TOKEN_NULL:
@@ -515,7 +495,6 @@ json_parse_object (JsonParser *parser,
{
JsonNode *node = NULL;
gchar *name = NULL;
- GValue value = { 0, };
if (token == G_TOKEN_COMMA)
{
@@ -621,44 +600,25 @@ json_parse_object (JsonParser *parser,
switch (token)
{
case G_TOKEN_INT:
- g_value_init (&value, G_TYPE_INT);
- g_value_set_int (&value, scanner->value.v_int);
-
node = json_node_new (JSON_NODE_VALUE);
- json_node_set_value (node, &value);
-
- g_value_unset (&value);
+ json_node_set_int (node, scanner->value.v_int);
break;
case G_TOKEN_FLOAT:
- g_value_init (&value, G_TYPE_DOUBLE);
- g_value_set_double (&value, scanner->value.v_float);
-
node = json_node_new (JSON_NODE_VALUE);
- json_node_set_value (node, &value);
-
- g_value_unset (&value);
+ json_node_set_double (node, scanner->value.v_float);
break;
case G_TOKEN_STRING:
- g_value_init (&value, G_TYPE_STRING);
- g_value_set_string (&value, scanner->value.v_string);
-
node = json_node_new (JSON_NODE_VALUE);
- json_node_set_value (node, &value);
-
- g_value_unset (&value);
+ json_node_set_string (node, scanner->value.v_string);
break;
case JSON_TOKEN_TRUE:
case JSON_TOKEN_FALSE:
- g_value_init (&value, G_TYPE_BOOLEAN);
- g_value_set_boolean (&value, token == JSON_TOKEN_TRUE ? TRUE : FALSE);
-
node = json_node_new (JSON_NODE_VALUE);
- json_node_set_value (node, &value);
-
- g_value_unset (&value);
+ json_node_set_boolean (node, token == JSON_TOKEN_TRUE ? TRUE
+ : FALSE);
break;
case JSON_TOKEN_NULL:
@@ -713,6 +673,25 @@ json_parse_statement (JsonParser *parser,
priv->root = priv->current_node = json_node_new (JSON_NODE_NULL);
return G_TOKEN_NONE;
+ case JSON_TOKEN_TRUE:
+ case JSON_TOKEN_FALSE:
+ priv->root = priv->current_node = json_node_new (JSON_NODE_VALUE);
+ json_node_set_boolean (priv->current_node,
+ token == JSON_TOKEN_TRUE ? TRUE : FALSE);
+ return G_TOKEN_NONE;
+
+ case G_TOKEN_INT:
+ case G_TOKEN_FLOAT:
+ case G_TOKEN_STRING:
+ priv->root = priv->current_node = json_node_new (JSON_NODE_VALUE);
+ if (token == G_TOKEN_INT)
+ json_node_set_int (priv->current_node, scanner->value.v_int);
+ else if (token == G_TOKEN_FLOAT)
+ json_node_set_double (priv->current_node, scanner->value.v_float);
+ else
+ json_node_set_string (priv->current_node, scanner->value.v_string);
+ return G_TOKEN_NONE;
+
default:
g_scanner_get_next_token (scanner);
return G_TOKEN_SYMBOL;