diff options
author | Emmanuele Bassi <ebassi@openedhand.com> | 2007-10-10 12:03:59 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@openedhand.com> | 2007-10-10 12:03:59 +0100 |
commit | b3ecd6e2fbdd58250427f406c43d60b8cb8d2644 (patch) | |
tree | bd6ad7ddd08c5f3f7e8cdf1657eaa7d5e1c6b342 /json-glib/json-parser.c | |
parent | a7839a06da53d32eb372b4813e5883a04e1c36b7 (diff) | |
download | json-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.c | 79 |
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; |