From 4ea8cd43986d5888fb8e809a198d6b0331b12480 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Sat, 28 May 2011 14:36:43 +0100 Subject: Add initial JSONPath implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JSONPath is a JSON query syntax similar to what XPath does for XML; using JSONPath it's possible to address a specific node (or set of nodes) inside a JSON document. The JsonPath class is a simple implementation of part of the JSONPath proposal, as formalised by Stefan Gössner here: http://goessner.net/articles/JsonPath/ The covered operators are: • root, or '$'; • child, both using the dot-notation and the bracket notation; • recursive descent, or '..'; • subscript, or '[]'; • set, or '[,]'; • slice, or '[start:end:step]'. The only missing operators are the filter, or '?()' and the script, or '()', because implementing a JavaScript interpreter inside JSON-GLib is not one of my greatest aspirations. It should be possible, though, to parse and evaluate simple arithmetic conditions, in the future. The JsonPath methods are pretty straightforward: a JsonPath instance should be created and used to compile an expression; the compilation might result in a syntax error or not. Then, the JsonPath instance can be used to match any JSON tree. Like the other JSONPath implementations, JsonPath returns a JSON array of matching nodes. A simple, one-off static method called json_path_query() is also provided; the method wraps the JsonPath creation, the expression compilation, and the matching, as well as disposing the JsonPath instance once done. For the time being, only positive testing is provided; negative testing for the expression compilation will follow. --- json-glib/json-path.h | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 json-glib/json-path.h (limited to 'json-glib/json-path.h') diff --git a/json-glib/json-path.h b/json-glib/json-path.h new file mode 100644 index 0000000..2bae608 --- /dev/null +++ b/json-glib/json-path.h @@ -0,0 +1,97 @@ +/* json-path.h - JSONPath implementation + * + * This file is part of JSON-GLib + * Copyright © 2011 Intel Corp. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: + * Emmanuele Bassi + */ + +#if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __JSON_PATH_H__ +#define __JSON_PATH_H__ + +#include + +G_BEGIN_DECLS + +#define JSON_TYPE_PATH (json_path_get_type ()) +#define JSON_PATH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), JSON_TYPE_PATH, JsonPath)) +#define JSON_IS_PATH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), JSON_TYPE_PATH)) + +/** + * JSON_PATH_ERROR: + * + * Error domain for #JsonPath errors + * + * Since: 0.14 + */ +#define JSON_PATH_ERROR (json_path_error_quark ()) + +/** + * JsonPathError: + * @JSON_PATH_ERROR_INVALID_QUERY: Invalid query + * + * Error code enumeration for the %JSON_PATH_ERROR domain. + * + * Since: 0.14 + */ +typedef enum { + JSON_PATH_ERROR_INVALID_QUERY +} JsonPathError; + +/** + * JsonPath: + * + * The JsonPath structure is an opaque object + * whose members cannot be directly accessed except through the provided + * API. + * + * Since: 0.14 + */ +typedef struct _JsonPath JsonPath; + +/** + * JsonPathClass: + * + * The JsonPathClass structure is an opaque + * object class whose members cannot be directly accessed. + * + * Since: 0.14 + */ +typedef struct _JsonPathClass JsonPathClass; + +GType json_path_get_type (void) G_GNUC_CONST; +GQuark json_path_error_quark (void); + +JsonPath * json_path_new (void); + +gboolean json_path_compile (JsonPath *path, + const char *expression, + GError **error); +JsonNode * json_path_match (JsonPath *path, + JsonNode *root); + +JsonNode * json_path_query (const char *expression, + JsonNode *root, + GError **error); + +G_END_DECLS + +#endif /* __JSON_PATH_H__ */ -- cgit v1.2.1