Marshalling JSON-RPC usando GLib 2.0

A biblioteca glib é uma das melhores bibliotecas genéricas para C/C++ criadas pelo projeto GNOME… Ela contém uma variedade grande de funções e estruturas para lidar com quase qualquer coisa, desde listas até rotinas que lidam com hashing (SHA1, MD5, …) e, não poderia faltar, JSON.

Abaixo temos um exemplo de construção da string que será usada como método de mashalling de um pacote JSON-RPC:

// *--- jsonreq.c ---*
//
// Compilar com:
//  gcc -O3 -o jsonreq jsonreq.c \
//    `pkg-config --cflags --libs glib-2.0 json-glib-1.0`
//
#include <stdio.h>
#include <glib.h>
#include <json-glib/json-glib.h>

// Uma estruturazinha simples que sofrerá "marshalling"...
struct request {
  char *method;
  int param1, param2;
  int id;
};

// Minha requisição para chamar o método 'calc(x,y)' via JSON-RPC.
struct request req = { "calc", 2, 4, 1 };

// Implementação de teste.
void main(void)
{
  JsonBuilder *builder;
  JsonGenerator *generator;
  JsonNode *root;
  gchar *str;

  // Cria um objeto JsonBuilder e cria o objeto JSON
  //  equivalente a:
  //
  //    {
  //     "jsonrpc":"2.0",
  //     "method":"calc",
  //     "params":[x,y],
  //     "id":1
  //    }
  builder = json_builder_new();
  json_builder_begin_object(builder);
    json_builder_set_member_name(builder, "jsonrpc");
    json_builder_add_string_value(builder, "2.0");

    json_builder_set_member_name(builder, "method");
    json_builder_add_string_value(builder, req.method);

    json_builder_set_member_name(builder, "params");
    json_builder_begin_array(builder);
      json_builder_add_int_value(builder, req.param1);
      json_builder_add_int_value(builder, req.param2);
    json_builder_end_array(builder);

    json_builder_set_member_name(builder, "id");
    json_builder_add_int_value(builder, req.id);
  json_builder_end_object(builder);

  // Cria um objeto JsonGeneator para serializar o que
  // o JsonBuilder construiu...
  generator = json_generator_new();

  // Obtém o nó root do JsonBuilder.
  root = json_builder_get_root(builder);

  // Informa o nó root para o generator.
  json_generator_set_root(generator, root);

  // Obtém a serialização em forma de string para
  //  ser usada no protocolo HTTP.
  str = json_generator_to_data(generator, NULL);

  // Libera o nó root (json_builder_get_root() exige isso!).
  json_node_free(root);

  // Libera os objetos JsonBuilder e JsonGenerator (são reference
  //   counted).
  g_object_unref(generator);
  g_object_unref(builder);

  // Faz alguma coisa com a string e a libera.
  printf("%s\n", str);
  g_free(str);
}

O código é auto explicativo…

O Qt também possui um conjunto de classes para lidar com JSON: QtJson, mas achei bastante complicado, em relação ao pacote json-glib-1.0. Além do mais, glib deixa seu código pequenininho…

No próximo post mostro o processo de unmarshalling, usando o objeto JsonParser, também com a glib…

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s