<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Everson Novka &#187; Open Source</title>
	<atom:link href="http://www.eversonnovka.com/tag/open-source/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.eversonnovka.com</link>
	<description>Delphi para todos!</description>
	<lastBuildDate>Tue, 06 Oct 2009 23:16:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Exportando dados de um DataSet para o formato JSON</title>
		<link>http://www.eversonnovka.com/exportando-dados-de-um-dataset-para-o-formato-json/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=exportando-dados-de-um-dataset-para-o-formato-json</link>
		<comments>http://www.eversonnovka.com/exportando-dados-de-um-dataset-para-o-formato-json/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 20:32:31 +0000</pubDate>
		<dc:creator>Everson Novka</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[DataSet]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Everson Novka]]></category>
		<category><![CDATA[Exemplo]]></category>
		<category><![CDATA[exportação]]></category>
		<category><![CDATA[Exportar]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[lkjson]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.eversonnovka.com/?p=24</guid>
		<description><![CDATA[Neste artigo serão demonstrados algoritmos para exportação de dados de um DataSet para o formato JSON. Até a versão 2009 do Delphi não há nada nativo para manipulação de arquivos JSON, por isso utilizei uma biblioteca Open Source chamada Delphi JSON Library (http://sourceforge.net/projects/lkjson). O que é JSON? JSON (JavaScript Object Notation &#8211; Notação de Objetos [...]]]></description>
			<content:encoded><![CDATA[<p>Neste artigo serão demonstrados algoritmos para exportação de dados de um DataSet para o formato JSON. Até a versão 2009 do Delphi não há nada nativo para manipulação de arquivos JSON, por isso utilizei uma biblioteca Open Source chamada Delphi JSON Library (http://sourceforge.net/projects/lkjson).</p>
<p><strong>O que é JSON?</strong></p>
<p>JSON (JavaScript Object Notation &#8211; Notação de Objetos JavaScript) é uma formatação leve de troca de dados. Para seres humanos, é fácil de ler e escrever. Para máquinas, é fácil de interpretar e gerar. Está baseado em um subconjunto da linguagem de programação JavaScript, Standard ECMA-262 3a Edição -Dezembro &#8211; 1999. JSON é em formato texto e completamente independente de linguagem, pois usa convenções que são familiares às linguagens, incluindo C++, C#, Java, JavaScript, Perl, Python, Delphi e muitas outras. Estas propriedades fazem com que JSON seja um formato ideal de troca de dados.</p>
<p>JSON está constituído em duas estruturas:</p>
<p>•             Uma coleção de pares nome/valor. Em várias linguagens, isto é caracterizado como um object, record, struct, hash table, keyed list, ou arrays associativas;</p>
<p>•             Uma lista ordenada de valores. Na maioria das linguagens, isto é caracterizado como um array, vetor, lista ou sequência.</p>
<p>São estruturas de dados universais. Virtualmente, todas as linguagens de programação modernas as suportam, de uma forma ou de outra. É aceitável que um formato de troca de dados que seja independente de linguagem de programação se baseie nessas estruturas.</p>
<p>Em JSON, os dados são apresentados da seguinte forma:</p>
<p>Um objeto é um conjunto desordenado de pares nome/valor. Um objeto começa com <strong>{</strong> (chave de abertura) e termina com <strong>}</strong> (chave de fechamento). Cada nome é seguido por <strong>:</strong> (dois pontos) e os pares nome/valor são seguidos por <strong>,</strong> (vírgula).</p>
<p><strong>Classes da biblioteca lkjson utilizadas:</strong></p>
<p><strong>TlkJSONobject: </strong>Utilizada para o cabeçalho e itens de lista do arquivo JSON;</p>
<p><strong>TlkJSONlist: </strong>Utilizada para guardar a lista de valores e nomes dos fields do DataSet.</p>
<p><strong>Implementação da classe manipuladora do arquivo JSON:</strong></p>
<pre name="code" class="pascal">
unit DataSetToJsonEngine;

interface

uses DB, uLkJSON;

type
  TCustomDataSetToJson = class
  private
    FJsonObjectMain : TlkJSONobject;
    FDataSet: TDataSet;
    procedure SetDataSet(const Value: TDataSet);
    procedure ValidateDataSet;
  public
    property DataSet : TDataSet read FDataSet write SetDataSet;
    constructor Create(const ADataSet : TDataSet);
    destructor Destroy; override;
    function Convert : WideString;
  end;

  TDataSetToJson = class(TCustomDataSetToJson);

implementation

uses SysUtils;

{ TCustomDataSetToJson }

function TCustomDataSetToJson.Convert: WideString;
var
  JsonList : TlkJSONlist;
  JsonDataFieldList : array of TlkJSONobject;
  I, IdxRecord : Integer;
begin
  ValidateDataSet;
  JsonList := TlkJSONlist.Create;
  try
    // Monto o cabeçalho da string Json
    FJsonObjectMain.Add('DataSetName', FDataSet.Name);
    FJsonObjectMain.Add('DataSetCount', FDataSet.RecordCount);
    with FDataSet do
    begin
      First;
      IdxRecord := 0;
      SetLength(JsonDataFieldList, FDataSet.RecordCount);
      // Adiciono os valores e nomes dos fields em uma lista
      while not EOF do
      begin
        JsonDataFieldList[IdxRecord] := TlkJSONobject.Create;
        for I := 0 to FieldCount - 1 do
          JsonDataFieldList[IdxRecord].Add(Fields[I].FieldName, Fields[i].AsString);
        JsonList.Add(JsonDataFieldList[IdxRecord]);
        Next;
        Inc(IdxRecord);
      end;
      // Atribuo a lista no objeto principal do Json
      FJsonObjectMain.Add('DataFieldList', JsonList);
      Result := TlkJSON.GenerateText(FJsonObjectMain);
    end;
  finally
    FreeAndNil(JsonList);
  end;
end;

constructor TCustomDataSetToJson.Create(const ADataSet: TDataSet);
begin
  FDataSet := ADataSet;
  FJsonObjectMain := TlkJSONobject.Create;
end;

destructor TCustomDataSetToJson.Destroy;
begin
  FJsonObjectMain.Free;
  inherited;
end;

procedure TCustomDataSetToJson.SetDataSet(const Value: TDataSet);
begin
  FDataSet := Value;
end;

procedure TCustomDataSetToJson.ValidateDataSet;
begin
  if FDataSet = nil then
    raise Exception.Create('DataSet não atribuído');
  FDataSet.Active := not(FDataSet.Active);
  if FDataSet.IsEmpty then
    raise Exception.Create('DataSet vazio');
end;

end.</pre>
<p><strong>Consumindo a classe manipuladora:</strong></p>
<p>Criar<strong> </strong>um novo form, adicione um botão e um MEMO. No evento OnClick do botão adicione<strong> </strong>o seguinte código:</p>
<pre name="code" class="pascal">
procedure TfrmDataSetToJsonMain.Button1Click(Sender: TObject);
var
  JsonEngine : TDataSetToJson;
begin
  JsonEngine := TDataSetToJson.Create(SQLQuery1);
  Memo1.Text := JsonEngine.Convert;
end;</pre>
<p><strong>Testando o arquivo JSON gerado:</strong></p>
<p>Neste exemplo o arquivo JSON foi gerando dentro de um campo MEMO, o texto nele contido poderá ser testado em uma ferramenta web, segue link: <a href="http://www.thomasfrank.se/downloadableJS/JSONeditor_example.html">http://www.thomasfrank.se/downloadableJS/JSONeditor_example.html</a></p>
<p style="text-align: center;">
<div id="attachment_35" class="wp-caption aligncenter" style="width: 566px"><img class="size-full wp-image-35  " title="TesteJson" src="http://www.eversonnovka.com/wp-content/uploads/2009/09/TestJSON.jpg" alt="Testando arquivo JSON" width="556" height="441" /><p class="wp-caption-text">Testando arquivo JSON</p></div>
<p><a href="http://www.eversonnovka.com/exemplos/json.rar">Fontes &#8211; Delphi 2009</a></p>
<p>Os dados exportados nesse exemplo está no banco de dados de exemplo do Firebird 2.1. Utilizei uma conexão DBExpress com o driver da Embarcadero <a href="http://groups.google.com/group/dbxfirebird">http://groups.google.com/group/dbxfirebird </a></p>
<p>Este é um pequeno exemplo de como criar arquivos JSON de forma rápida e fácil. No próximo artigo teremos um exemplo de como trocar arquivos JSON via socket com uma aplicação JavaScript.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eversonnovka.com/exportando-dados-de-um-dataset-para-o-formato-json/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

