json linux c parser

4 篇文章 0 订阅

JSON-GLib

About

JSON-GLib is a library providing serialization and deserialization support for the JavaScript Object Notation (JSON) format described by RFC 4627. JSON is:

a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language. -- From Introducing JSON

Many high-level languages already provide native modules for parsing, generating and manipulating JSON data streams. JSON-GLib is a C library based on GLib and released under the terms of the GNU Lesser General Public License version 2.1. It provides a parser and a generator GObject classes and various wrappers for the complex data types employed by JSON, such as arrays and objects.

JSON-GLib uses GLib native data types and the generic value container GValue for ease of development. It also provides integration with the GObject classes for direct serialization into, and deserialization from, JSON data streams.

Development

Releases

  • Latest stable release: 0.14 (here)

Examples

Parser example

#include <stdlib.h>
#include <glib-object.h>
#include <json-glib/json-glib.h>

int
main (int argc, char *argv[])
{
  JsonParser *parser;
  JsonNode *root;
  GError *error;

  if (argc < 2)
    {
      g_print ("Usage: test <filename.json>\n");
      return EXIT_FAILURE;
    }

  g_type_init ();

  parser = json_parser_new ();

  error = NULL;
  json_parser_load_from_file (parser, argv[1], &error);
  if (error)
    {
      g_print ("Unable to parse `%s': %s"\n, argv[1], error->message);
      g_error_free (error);
      g_object_unref (parser);
      return EXIT_FAILURE;
    }

  root = json_parser_get_root (parser);

  /* manipulate the object tree and then exit */

  g_object_unref (parser);

  return EXIT_SUCCESS;
}

Deserialization Sample

#include <json-glib/json-glib.h>
#include <json-glib/json-gobject.h>

#define FOO_TYPE_OBJECT (foo_object_get_type ())

/* usual GObject boilerplate */

typedef enum { /*< prefix=FOO_BLAH >*/
  FOO_BLAH_ALPHA,
  FOO_BLAH_BRAVO,
  FOO_BLAH_CHARLIE
} FooBlahEnum;

static const gchar *foo_object_json = "
{
  \"bar\"  : 42,
  \"baz\"  : true,
  \"blah\" : \"bravo\"
}
";

int
main (int   argc,
      char *argv[])
{
  FooObject *foo;
  gint bar_int;
  gboolean baz_boolean;
  FooBlahEnum blah_enum;
  GError *error;

  g_type_init ();

  error = NULL;
  foo = json_construct_gobject (FOO_TYPE_OBJECT, foo_object_json, -1, &error);
  if (error)
    g_error ("Unable to create instance: %s", error->message);

  /* FooObject has three properties: bar, blah and baz */
  g_object_get (G_OBJECT (foo),
                "bar", &bar_int,
                "baz", &baz_boolean,
                "blah", &blah_enum,
                NULL);

  g_object_unref (foo);

  return EXIT_SUCCESS;
}

High level APIs

The 0.12 release added these new, high level classes for building and reading JSON trees

  • JsonBuilder: a simple API for building JSON trees

  JsonBuilder *builder = json_builder_new ();

  json_builder_begin_object (builder);

  json_builder_set_member_name (builder, "url");
  json_builder_add_string_value (builder, "http://www.gnome.org/img/flash/two-thirty.png");

  json_builder_set_member_name (builder, "size");
  json_builder_begin_array (builder);
  json_builder_add_int_value (builder, 652);
  json_builder_add_int_value (builder, 242);
  json_builder_end_array (builder);

  json_builder_end_object (builder);

  JsonGenerator *gen = json_generator_new ();
  JsonNode * root = json_builder_get_root (builder);
  json_generator_set_root (gen, root);
  gchar *str = json_generator_to_data (generator, NULL);

  json_node_free (root);
  g_object_unref (generator);
  g_object_unref (builder);

  /* "str" now contains the string:
   * { "url" : "http://www.gnome.org/img/flash/two-thirty.png", "size" : [ 652, 242 ] }
   */
  • JsonReader: a cursor-based API for parsing JSON trees

  /* str contains the JSON from the example above */
  JsonParser *parser = json_parser_new ();
  json_parser_load_from_data (parser, str, -1, NULL);

  JsonReader *reader = json_reader_new (json_parser_get_root (parser));

  json_reader_read_member (reader, "url");
  const char *url = json_reader_get_string_value (reader);
  json_reader_end_member (reader);

  json_reader_read_member (reader, "size");
  json_reader_read_element (reader, 0);
  int width = json_reader_get_int_value (reader);
  json_reader_end_element (reader);
  json_reader_read_element (reader, 1);
  int height = json_reader_get_int_value (reader);
  json_reader_end_element (reader);
  json_reader_end_member (reader);

  g_object_unref (reader);
  g_object_unref (parser);
  • Asynchronous stream parsing

static void
on_load_complete (GObject      *gobject,
                  GAsyncResult *result,
                  gpointer      user_data)
{
  JsonParser *parser = JSON_PARSER (gobject);
  GError *error = NULL;
  gboolean res;

  res = json_parser_load_from_stream_finish (parser, result, &error);
  if (!res)
    g_error ("Unable to parse stream: %s", error->message);

  JsonReader *reader = json_reader_new (json_parser_get_root (parser));

  /* read the JSON tree */

  g_object_unref (reader);
}

...

  JsonParser *parser = json_parser_new ();

  json_parser_load_from_stream_async (parser, G_INPUT_STREAM (stream),
                                      NULL,
                                      on_load_complete, NULL);

JsonGlib (last edited 2012-05-29 15:56:02 by MinaNaguib)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值