<?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>Andreano Lanusse &#124; Tecnologia e Desenvolvimento de Software &#187; JSON</title>
	<atom:link href="http://www.andreanolanusse.com/pt/tag/json/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andreanolanusse.com/pt</link>
	<description>Andreano Lanusse blog - acesse artigos, tutoriais e vídeos sobre tecnologia, desenvolvimento de software, técnicas de programação, banco de dados, jogos e mais.</description>
	<lastBuildDate>Wed, 25 Jan 2012 11:00:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Vídeo: Serialização de objetos JSON &#8211; Delphi Conference 2010 Brasil</title>
		<link>http://www.andreanolanusse.com/pt/video-serializacao-de-objetos-json-delphi-conference-2010-brasil/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=video-serializacao-de-objetos-json-delphi-conference-2010-brasil</link>
		<comments>http://www.andreanolanusse.com/pt/video-serializacao-de-objetos-json-delphi-conference-2010-brasil/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 01:21:07 +0000</pubDate>
		<dc:creator>Andreano Lanusse</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Delphi Conference 2010]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Vídeo]]></category>

		<guid isPermaLink="false">http://www.andreanolanusse.com/pt/?p=1182</guid>
		<description><![CDATA[<p>Marcela Varela apresenta na prática conceitos da representação de objetos usando JSON (Javascript Object Notation) e como usar as classes do Delphi XE para tratar conversões de objetos, simples e complexos, para este padrão, simplificando a transferência e serialização de objetos. Em função do alto volume de views dos vídeos do Delphi Conference, estamos disponibilizando [...]</p><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></description>
			<content:encoded><![CDATA[<p>Marcela Varela apresenta na prática conceitos da representação de objetos usando JSON (Javascript Object Notation) e como usar as classes do Delphi XE para tratar conversões de objetos, simples e complexos, para este padrão, simplificando a transferência e serialização de objetos.</p>
<p>Em função do alto volume de views dos vídeos do Delphi Conference, estamos disponibilizando apenas o download para que você possa assistir em sua máquina.</p>
<p><a href="http://video.embarcadero.com/dc2010/DC2010_Serializacao_JSON.zip" target="_blank"><img class="alignleft size-full wp-image-1149" title="Download MP4" src="http://www.andreanolanusse.com/pt/wp-content/uploads/2010/12/btn_download_MP4.gif" alt="" width="124" height="23" /></a></p>
<h2  class="related_post_title">Posts relacionados</h2><ul class="related_post"><li><a href="http://www.andreanolanusse.com/pt/video-delphi-xe2-e-firemonkey-app-no-windows-mac-e-ios/" title="Vídeo: Delphi XE2 e FireMonkey app no Windows, Mac e iOS">Vídeo: Delphi XE2 e FireMonkey app no Windows, Mac e iOS</a></li><li><a href="http://www.andreanolanusse.com/pt/video-webinar-o-que-voce-pode-fazer-com-rad-studio-xe/" title="Vídeo: Webinar o que você pode fazer com RAD Studio XE">Vídeo: Webinar o que você pode fazer com RAD Studio XE</a></li><li><a href="http://www.andreanolanusse.com/pt/video-nota-fiscal-eletronica-delphi-conference-2010-brasil/" title="Vídeo: Nota Fiscal Eletrônica &#8211; Delphi Conference 2010 Brasil">Vídeo: Nota Fiscal Eletrônica &#8211; Delphi Conference 2010 Brasil</a></li><li><a href="http://www.andreanolanusse.com/pt/video-reconhecimento-facil-delphi-conference-2010-brasil/" title="Vídeo: Reconhecimento Facial &#8211; Delphi Conference 2010 Brasil">Vídeo: Reconhecimento Facial &#8211; Delphi Conference 2010 Brasil</a></li><li><a href="http://www.andreanolanusse.com/pt/video-desenvolva-software-oo-sem-deixar-de-ser-rad-delphi-conference-2010-brasil/" title="Vídeo: Desenvolva software OO sem deixar de ser RAD &#8211; Delphi Conference 2010 Brasil">Vídeo: Desenvolva software OO sem deixar de ser RAD &#8211; Delphi Conference 2010 Brasil</a></li><li><a href="http://www.andreanolanusse.com/pt/video-threads-e-datasnap-otimizando-um-servidor-de-aplicacao-delphi-conference-2010-brasil/" title="Vídeo: Threads e DataSnap – otimizando um servidor de aplicação – Delphi Conference 2010 Brasil">Vídeo: Threads e DataSnap – otimizando um servidor de aplicação – Delphi Conference 2010 Brasil</a></li></ul><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreanolanusse.com/pt/video-serializacao-de-objetos-json-delphi-conference-2010-brasil/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apresentações do Delphi Conference 2010 disponível para download</title>
		<link>http://www.andreanolanusse.com/pt/apresentacoes-do-delphi-conference-2010-disponivel-para-download/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=apresentacoes-do-delphi-conference-2010-disponivel-para-download</link>
		<comments>http://www.andreanolanusse.com/pt/apresentacoes-do-delphi-conference-2010-disponivel-para-download/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 23:54:24 +0000</pubDate>
		<dc:creator>Andreano Lanusse</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Delphi Conference 2010]]></category>
		<category><![CDATA[Delphi Prism (.NET)]]></category>
		<category><![CDATA[RadPHP]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[DataSnap]]></category>
		<category><![CDATA[dbExpress]]></category>
		<category><![CDATA[InterBase]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.andreanolanusse.com/pt/?p=1117</guid>
		<description><![CDATA[<p>Já está disponível o material utilizado nas apresentações do Delphi Conference 2010 Brasil, os slides disponibilizados trazem informações valiosas e link para download dos exemplos utilizados. Para efetuar o download das apresentações você precisa de uma conta no EDN (Embarcadero Developer Network), que é grátis, caso você já a tenha, efetue o login e tenha [...]</p><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></description>
			<content:encoded><![CDATA[<p>Já está disponível o material utilizado nas apresentações do Delphi Conference 2010 Brasil, os slides disponibilizados trazem informações valiosas e link para download dos exemplos utilizados.</p>
<p>Para efetuar o download das apresentações você precisa de uma conta no EDN (Embarcadero Developer Network), que é grátis, caso você já a tenha, efetue o login e tenha acesso ao melhor conteúdo já apresentado sobre Delphi.</p>
<p>Artigo do EDN com todas as apresentações, <a href="http://edn.embarcadero.com/br/article/41104" target="_blank"><strong>clique aqui</strong></a>.</p>
<h2  class="related_post_title">Posts relacionados</h2><ul class="related_post"><li><a href="http://www.andreanolanusse.com/pt/copyreadertoclientdataset-blob-e-a-mensagem-feature-not-implemented/" title="CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;">CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;</a></li><li><a href="http://www.andreanolanusse.com/pt/exemplos-e-slides-do-delphi-meeting-2011/" title="Exemplos e slides do Delphi Meeting 2011">Exemplos e slides do Delphi Meeting 2011</a></li><li><a href="http://www.andreanolanusse.com/pt/teste-nosso-servidor-datasnap-xe-instalado-no-amazon-cloud/" title="Teste nosso servidor DataSnap XE instalado no Amazon Cloud">Teste nosso servidor DataSnap XE instalado no Amazon Cloud</a></li><li><a href="http://www.andreanolanusse.com/pt/datasnap-xe-e-windows-azure-preview-3/" title="DataSnap XE e Windows Azure – RAD Studio XE Preview #3">DataSnap XE e Windows Azure – RAD Studio XE Preview #3</a></li><li><a href="http://www.andreanolanusse.com/pt/copiando-estrutura-e-dados-de-um-dbxreader-para-clientdataset-datasnap-2010/" title="Copiando estrutura e dados de um DBXReader para ClientDataSet – DataSnap 2010">Copiando estrutura e dados de um DBXReader para ClientDataSet – DataSnap 2010</a></li><li><a href="http://www.andreanolanusse.com/pt/utilizando-generics-para-transformacao-generica-de-objetos-em-datasnap-2010/" title="Utilizando generics para transformação genérica de Objetos em DataSnap 2010">Utilizando generics para transformação genérica de Objetos em DataSnap 2010</a></li></ul><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreanolanusse.com/pt/apresentacoes-do-delphi-conference-2010-disponivel-para-download/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Utilizando generics para transformação genérica de Objetos em DataSnap 2010</title>
		<link>http://www.andreanolanusse.com/pt/utilizando-generics-para-transformacao-generica-de-objetos-em-datasnap-2010/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=utilizando-generics-para-transformacao-generica-de-objetos-em-datasnap-2010</link>
		<comments>http://www.andreanolanusse.com/pt/utilizando-generics-para-transformacao-generica-de-objetos-em-datasnap-2010/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 01:20:16 +0000</pubDate>
		<dc:creator>Andreano Lanusse</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[DataSnap]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.andreanolanusse.com/pt/?p=865</guid>
		<description><![CDATA[<p>No meu post anterior &#8220;DataSnap 2010 &#8211; Enviando e Recebendo objetos&#8221; mostrei como transferir objetos através de JSON objects, nos comentários relacionados a este post Rafael Soares fez uma interessante observação com relação a necessidade de se ter que escrever em toda a classes os métodos de conversão de JSON para TObject e TObject para [...]</p><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-781" style="border: 0pt none; margin: 4px;" title="Delphi" src="http://www.andreanolanusse.com/pt/wp-content/uploads/2010/03/Icon_Delphi.png" alt="" width="175" height="175" />No meu post anterior <a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-objetos/">&#8220;DataSnap 2010 &#8211; Enviando e Recebendo objetos&#8221;</a> mostrei como transferir objetos através de JSON objects, nos comentários relacionados a este post Rafael Soares fez uma interessante observação com relação a necessidade de se ter que escrever em toda a classes os métodos de conversão de JSON para TObject e TObject para JSON. Na verdade isso não é necessário, você pode utilizar generics e assim ter apenas dois métodos de conversão para qualquer classe.</p>
<p>O exemplo utilizado no post anterior o qual os fontes foram disponibilizados para download, traz a classe TCustomer como exemplo e implementa os método JSONtoCustomer e CustomerToJSON, este fazem referência direta a classe TCustomer, assim sendo fiz algumas modificações onde nos permitirá utilizar estes dois métodos para qualquer classe, primeiro os métodos foram renomeados para JSONtoObject e ObjectToJSON e adicionados a uma nova classe chamada TBaseObject, este métodos foram definidos como class function, desta forma não precisamos instanciar o objeto. Agora TCustomer passa a herdar desta, assim sendo qualquer objeto terá este método implemetado.</p>
<p>Os métodos da classe TBaseObject agora definem &lt;T&gt; como parâmetro de entrada e retorno, ou seja, o tipo que for definido durante a utilização do método é o que será considerado pelo método, aqui estamos utilizando Generics.</p>
<pre class="brush: delphi">
unit BaseObject;

interface

uses DBXJSON, DBXJSONReflect;

type
  TBaseObject = class
  public
    { public declarations }
    class function ObjectToJSON&lt;T : class&gt;(myObject: T): TJSONValue;
    class function JSONToObject&lt;T : class&gt;(json: TJSONValue): T;
  end;

implementation

{ TBaseObject }

class function TBaseObject.JSONToObject&lt;T&gt;(json: TJSONValue): T;
var
  unm: TJSONUnMarshal;
begin
  if json is TJSONNull then
    exit(nil);
  unm := TJSONUnMarshal.Create;
  try
    exit(T(unm.Unmarshal(json)))
  finally
    unm.Free;
  end;

end;

class function TBaseObject.ObjectToJSON&lt;T&gt;(myObject: T): TJSONValue;
var
  m: TJSONMarshal;
begin

  if Assigned(myObject) then
  begin
    m := TJSONMarshal.Create(TJSONConverter.Create);
    try
      exit(m.Marshal(myObject));
    finally
      m.Free;
    end;
  end
  else
    exit(TJSONNull.Create);

end;

end.
</pre>
<p>Já a classe TCustomer herda de TBaseObject.</p>
<pre class="brush: delphi">unit Customer;

interface

uses
   DBXJSON, DBXJSONReflect, SysUtils, BaseObject;

type
   TMaritalStatus = (msMarried, msEngaged, msEligible);

TCustomer = class(TBaseObject)
    private
       FName: string;
       FAge: integer;
       FMaritalStatus: TMaritalStatus;
    public
        property Name: string read FName write FName;
        property Age: integer read FAge write FAge;
        property MaritalStatus: TMaritalStatus read FMaritalStatus write FMaritalStatus;

        function toString : string;override;
  end;</pre>
<p>Agora todos os Server Methods da classe TDSServerMethods passam a utilizar os métodos de conversão de objetos especificando qual o tipo que deverá ser utilizado. O exemplo abaixo retorna uma lista de TJSONArray, cada elemento adicionado ao Array usa a sintaxe TCustomer.ObjectToJSON&lt;TCustomer&gt;.</p>
<p>&lt;TCustomer&gt; define que o tipo do Objeto que está sendo adicionado ao Array.</p>
<pre class="brush: delphi">
function TDSServerMethods.ListofCustomer: TJSONArray;
var
  i: Integer;
  myCustomer: TCustomer;
begin
  Result := TJSONArray.Create;

  for i := 0 to 19 do
  begin
    myCustomer := GetCustomer;
    myCustomer.Name := 'Customer ' + IntToStr(i);
    myCustomer.Age := i;
    Result.AddElement(myCustomer.ObjectToJSON&lt;TCustomer&gt;(myCustomer));
  end;
end;
</pre>
<p>Para ler o retorno no lado Client utilizamos o mesmo princípio com Generics, onde cada item é transformado de JSON para TCustomer conforme o exemplo abaixo:</p>
<pre class="brush: delphi">
var
  proxy: TDSServerMethodsClient;
  mySingleCustomer: TCustomer;
  allCustomers: TJSONArray;
  i: Integer;
begin

  proxy := nil;
  try
    proxy := TDSServerMethodsClient.Create
      (DMClientContainer.MyDSServer.DBXConnection);
    allCustomers := proxy.ListofCustomer;

    for i := 0 to allCustomers.Size - 1 do
    begin
      mySingleCustomer := TCustomer.JSONToObject&lt;TCustomer&gt;(allCustomers.Get(i));
      MMLog.Lines.Add(mySingleCustomer.ToString);
      mySingleCustomer.Free;
    end;

  finally
    proxy.Free;
  end;
</pre>
<p>Vimos aqui como Generics nos auxilia na transformação de objetos em DataSnap.</p>
<p>O exemplo atualizado está disponível no CodeCentral &#8211; Download do <a href="http://cc.embarcadero.com/Download.aspx?id=27361">código fonte</a></p>
<h2  class="related_post_title">Posts relacionados</h2><ul class="related_post"><li><a href="http://www.andreanolanusse.com/pt/apresentacoes-do-delphi-conference-2010-disponivel-para-download/" title="Apresentações do Delphi Conference 2010 disponível para download">Apresentações do Delphi Conference 2010 disponível para download</a></li><li><a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-array-de-strings-numbers-e-outros-tipos/" title="DataSnap 2010 – enviando e recebendo ARRAY de strings, numbers e outros tipos">DataSnap 2010 – enviando e recebendo ARRAY de strings, numbers e outros tipos</a></li><li><a href="http://www.andreanolanusse.com/pt/utilizando-callback-em-datasnap-2010/" title="Utilizando callback em DataSnap 2010">Utilizando callback em DataSnap 2010</a></li><li><a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-objetos/" title="DataSnap 2010 – Enviando e recebendo objetos">DataSnap 2010 – Enviando e recebendo objetos</a></li><li><a href="http://www.andreanolanusse.com/pt/copyreadertoclientdataset-blob-e-a-mensagem-feature-not-implemented/" title="CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;">CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;</a></li><li><a href="http://www.andreanolanusse.com/pt/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class/" title="Publicando providers durante o registro dinâmico de DataSnap Server Class">Publicando providers durante o registro dinâmico de DataSnap Server Class</a></li></ul><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreanolanusse.com/pt/utilizando-generics-para-transformacao-generica-de-objetos-em-datasnap-2010/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>DataSnap 2010 – enviando e recebendo ARRAY de strings, numbers e outros tipos</title>
		<link>http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-array-de-strings-numbers-e-outros-tipos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=datasnap-2010-enviando-e-recebendo-array-de-strings-numbers-e-outros-tipos</link>
		<comments>http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-array-de-strings-numbers-e-outros-tipos/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 23:37:40 +0000</pubDate>
		<dc:creator>Andreano Lanusse</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[DataSnap]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.andreanolanusse.com/pt/?p=388</guid>
		<description><![CDATA[<p>Dando sequência ao tema transferência de objetos com DataSnap o qual iniciei escrevendo sobre a transferência de um simples objeto, e depois sobre o envio de array objetos, agora vamos descrever como enviar array que contenha tipos distintos. Para retornar tipos String, Integer, Double, Real, Boolean e outros tipos, utilizamos a classe TJSONValue que serve [...]</p><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-311" style="border: 0pt none; margin: 4px;" title="Delphi icon" src="http://www.andreanolanusse.com/pt/wp-content/uploads/2009/09/delphiloho.png" alt="Delphi" width="97" height="97" />Dando sequência ao tema transferência de objetos com DataSnap o qual iniciei escrevendo sobre a <a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-objetos/"><strong>transferência de um simples objeto</strong></a>, e depois sobre o <a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-objetos/"><strong>envio de array objetos</strong></a>, agora vamos descrever como enviar array que contenha tipos distintos.</p>
<p>Para retornar tipos String, Integer, Double, Real, Boolean e outros tipos, utilizamos a classe TJSONValue que serve como base para as classes TJSONString, TJSONNumber, TJSONTrue, TJSONFalse, TJSONNull e TJSONObject. O retorno de uma lista destes tipos é representando pelo TJSONArray, comentando no meu post anterior.</p>
<p>Abaixo exemplo de um ServerMethod que retorna um TJSONArray o qual contém vários items, cada um deles de tipos diferentes.</p>
<pre class="brush: pascal">
function TDSServerMethods.ListofDifferentTypes: TJSONArray;
var
  strval: TJSONString;
  trueval : TJSONTrue;
  falseval : TJSONFalse;
  numval: TJSONNumber;
  objval : TJSONObject;
begin
  Result := TJSONArray.Create;

  strval := TJSONString.Create('Return String value from DataSnap Server');
  Result.AddElement(strval);

  numval := TJSONNumber.Create(100);
  Result.AddElement(numval);

  numval := TJSONNumber.Create(99.99);
  Result.AddElement(numval);

  trueval := TJSONTrue.Create;
  Result.AddElement(trueval);

  falseval := TJSONFalse.Create;
  Result.AddElement(falseval);

  Result.AddElement(CustomerToJSON(GetCustomer));

end;</pre>
<p>Agora basta acessar o método através da aplicação cliente o qual será capaz de reconhecer todos os tipos de objetos aqui enviados.</p>
<pre class="brush: pascal">var
  proxy: TDSServerMethodsClient;
  mySingleValue: TJSONValue;
  allValues: TJSONArray;
  i: Integer;
begin

  proxy := nil;
  try
    proxy := TDSServerMethodsClient.Create
      (DMClientContainer.MyDSServer.DBXConnection);
    allValues := proxy.ListofDifferentTypes;
    for i := 0 to allValues.Size - 1 do
    begin
      mySingleValue := allValues.Get(i);

      if mySingleValue is TJSONString then
        MMLog.Lines.Add('TJSONString value ' + mySingleValue.Value)
      else if mySingleValue is TJSONNumber then
        MMLog.Lines.Add('TJSONNumber value ' + mySingleValue.Value)
      else if mySingleValue is TJSONTrue then
        MMLog.Lines.Add('TJSONTrue value ' + mySingleValue.ToString)
      else if mySingleValue is TJSONFalse then
        MMLog.Lines.Add('TJSONFalse value ' + mySingleValue.ToString)
      else if mySingleValue is TJSONObject then
        MMLog.Lines.Add('TJSONObject value ' + mySingleValue.ToString);

    end;

  finally
    proxy.Free;
  end;

end;</pre>
<p>Ao executar o retorno será:</p>
<p>TJSONString value Return String value from DataSnap Server<br />
TJSONString value 100<br />
TJSONString value 99.99<br />
TJSONTrue value true<br />
TJSONFalse value false<br />
TJSONObject value {&#8220;type&#8221;:&#8221;Customer.TCustomer&#8221;,&#8221;id&#8221;:1,&#8221;fields&#8221;:{&#8220;FName&#8221;:&#8221;Andreano Lanusse&#8221;,&#8221;FAge&#8221;:32,&#8221;FMaritalStatus&#8221;:&#8221;msMarried&#8221;}}</p>
<p>No caso to TJSONObject foi utilizado o método ToString o qual retorna a representação do objeto em formato JSON, através da classe TJSONUnMarshal convertermos para TCustomer, esta conversão foi tratada no <a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-array-de-objetos/"><strong>posto anterior</strong></a>.</p>
<p>Download do <a href="http://cc.embarcadero.com/Download.aspx?id=27361">código fonte</a></p>
<h2  class="related_post_title">Posts relacionados</h2><ul class="related_post"><li><a href="http://www.andreanolanusse.com/pt/apresentacoes-do-delphi-conference-2010-disponivel-para-download/" title="Apresentações do Delphi Conference 2010 disponível para download">Apresentações do Delphi Conference 2010 disponível para download</a></li><li><a href="http://www.andreanolanusse.com/pt/utilizando-generics-para-transformacao-generica-de-objetos-em-datasnap-2010/" title="Utilizando generics para transformação genérica de Objetos em DataSnap 2010">Utilizando generics para transformação genérica de Objetos em DataSnap 2010</a></li><li><a href="http://www.andreanolanusse.com/pt/utilizando-callback-em-datasnap-2010/" title="Utilizando callback em DataSnap 2010">Utilizando callback em DataSnap 2010</a></li><li><a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-objetos/" title="DataSnap 2010 – Enviando e recebendo objetos">DataSnap 2010 – Enviando e recebendo objetos</a></li><li><a href="http://www.andreanolanusse.com/pt/copyreadertoclientdataset-blob-e-a-mensagem-feature-not-implemented/" title="CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;">CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;</a></li><li><a href="http://www.andreanolanusse.com/pt/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class/" title="Publicando providers durante o registro dinâmico de DataSnap Server Class">Publicando providers durante o registro dinâmico de DataSnap Server Class</a></li></ul><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-array-de-strings-numbers-e-outros-tipos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilizando callback em DataSnap 2010</title>
		<link>http://www.andreanolanusse.com/pt/utilizando-callback-em-datasnap-2010/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=utilizando-callback-em-datasnap-2010</link>
		<comments>http://www.andreanolanusse.com/pt/utilizando-callback-em-datasnap-2010/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 07:54:40 +0000</pubDate>
		<dc:creator>Andreano Lanusse</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[DataSnap]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.andreanolanusse.com/pt/?p=376</guid>
		<description><![CDATA[<p>Solicitação número 1 dos usuários de DataSnap, suporte a callback, DataSnap 2010 permite a execução de server methods utilizando callback, em outras palavras, é esperar que o servidor envie retornos a aplicação cliente durante o processamento. Para exemplicar melhor, imagine os famosos fechamentos de final do mês, estes são disparados a partir de uma aplicação [...]</p><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-311" title="DataSnap 2010 callback" src="http://www.andreanolanusse.com/pt/wp-content/uploads/2009/09/delphiloho.png" alt="DataSnap 2010 callback" width="97" height="97" />Solicitação número 1 dos usuários de DataSnap, suporte a callback, <a href="http://www.andreanolanusse.com/pt/tag/datasnap/">DataSnap</a> 2010 permite a execução de server methods utilizando callback, em outras palavras, é esperar que o servidor envie retornos a aplicação cliente durante o processamento. Para exemplicar melhor, imagine os famosos fechamentos de final do mês, estes são disparados a partir de uma aplicação cliente que somente recebe um retorno ao finalizar o processo do lado servidor, com callback podemos notificar a aplicação cliente como está o processamento do lado servidor.<br />
A classe TDBXCallback é responsável pelo callback, assim você deverá criar uma classe descendente, implementar o método execute e passar como parâmetro no seu server method. O servidor irá executar o método Execute do parâmetro de callback enviado ao servidor, na verdade o servidor está notificando o cliente para executar algum código.</p>
<p>Para melhor exemplificar, vamos imaginar que você precisa fazer o backup da sua base de dados a partir de uma instrução enviada pela aplicação cliente para o servidor, durante o processo de backup você deseja saber como está o andamento do backup, esta é uma tarefa para o callback, o código faz exatamento isso, backup de uma base de dados <strong><a href="http://www.embarcadero.com/products/interbase">InterBase</a></strong> e retorna o log para a aplicação cliente.</p>
<p>Para começar temos que implementar o server method que será responsável por executar o backup, este obrigatoriamente necessita um parâmetro do tipo TDBXCallback o qual será responsável por enviar a notificação a aplicação cliente através do método Execute.</p>
<p>O método Execute por sua vez recebe envia um TJSONObject o qual contém um TJSONPair com as mensagens do log de backup da base de dados, lembre-se que eu optei por enviar apenas um valor dentro do objeto e a cada linha de log recebida o cliente será notificado que há uma mensagem nova.</p>
<pre class="brush: delphi">
procedure TDSServerBatch.StartBackup(sMessage: TDBXCallback;
  sBackupFileName: String);
var
  LCallbackValue: TJSONObject;
  db: String;

begin

  db := DMServerContainer.GetEmployeeDBName;

  srvBackup.DatabaseName := Copy(db, Pos(':', db) + 1, Length(db));

  srvBackup.Attach;
  srvBackup.BackupFile.Add(sBackupFileName);

  srvBackup.ServiceStart;
  if srvBackup.Verbose then
    while not srvBackup.Eof do
    begin

      // if srvBackup.IsServiceRunning then
      begin
        LCallbackValue := TJSONObject.Create;
        LCallbackValue.AddPair(TJSONPair.Create('Server return',
            srvBackup.GetNextLine));

        sMessage.Execute(LCallbackValue);

      end;

    end;

  if srvBackup.Active then
    srvBackup.Detach();

end;</pre>
<p>Vamos agora ao lado cliente, como temos que passar um parâmetro do tipo TDBXCallback então teremos que criar e implementar a tal classe. Vem a pergunta, para cada server method que necessita efetuar callback terei que criar uma classe de callback? A resposta é não, neste exemplo utilizaremos anonymous method para evitar isso.</p>
<p>Abaixo a classe de callback que estarei utilizando, veja que o método execute recebe um parâmetro do tipo TDSCallbackMethod o qual é um anonymous method, desta forma na criação da instância desta classe será passado o código a ser executando quando o servidor executar o método Execute.</p>
<pre class="brush: delphi">type
  TDSCallbackMethod = reference to function(const Args: TJSONValue): TJSONValue;

  TMessageCallback = class(TDBXCallback)
  private
    FCallBackMethod: TDSCallbackMethod;

  public
    constructor Create(CallBackMethod: TDSCallbackMethod);
    function Execute(const Arg: TJSONValue): TJSONValue; override;
  end;

implementation

constructor TMessageCallback.Create(CallBackMethod: TDSCallbackMethod);
begin
  FCallBackMethod := CallBackMethod;
end;

function TMessageCallback.Execute(const Arg: TJSONValue): TJSONValue;
begin
  Result := FCallbackMethod(Arg);
end;</pre>
<p>Com a classe de callback definida, temos agora que implementar o anonymous method e executar o server method conforme o exemplo a seguir.</p>
<p>Veja que o parâmetro Args do anonymous method é do tipo TJSONValue, extraimos os valores TJSONPair onde se encontra o log do backup.</p>
<pre class="brush: delphi">var
  s : TDSServerBatchClient;
begin

  callback := TMessageCallback.Create( function(const Args: TJSONValue) : TJSONValue

    var
     LJSONObject: TJSONObject; I: Integer;
     LMessage: string;
    begin
      // Extract information about the transformation from Json
      LJSONObject := TJSONObject(Args);
      Result := nil;

      for I := 0 to LJSONObject.Size - 1 do begin
         with LJSONObject.Get(I) do
           LMessage := LMessage + Format('%s ==&gt;&gt; "%s"', [JSonString.Value, JsonValue.Value]);

      // Display information in a listbox
        MMBackupLog.Lines.Add(LMessage);
        MMBackupLog.Update;
        Result := TJSONTrue.Create;

      end;
    end);</pre>
<p>Na sequência apenas executamos o método, passando a classe callback com parâmetro e o anonymous method será responsável por adicionar a mensagem de retorno no campo memo que está na tela, utilizado neste exemplo.</p>
<pre class="brush: delphi">  s := TDSServerBatchClient.Create(DMClientContainer.MyDSServer.DBXConnection);
  s.StartBackup(callback, 'mybackup.ibk');</pre>
<p>Espero que este post tenha esclarecido as dúvidas relacionadas a callback.</p>
<p>Download do <a href="http://cc.embarcadero.com/item/27391">código fonte</a>.</p>
<h2  class="related_post_title">Posts relacionados</h2><ul class="related_post"><li><a href="http://www.andreanolanusse.com/pt/apresentacoes-do-delphi-conference-2010-disponivel-para-download/" title="Apresentações do Delphi Conference 2010 disponível para download">Apresentações do Delphi Conference 2010 disponível para download</a></li><li><a href="http://www.andreanolanusse.com/pt/utilizando-generics-para-transformacao-generica-de-objetos-em-datasnap-2010/" title="Utilizando generics para transformação genérica de Objetos em DataSnap 2010">Utilizando generics para transformação genérica de Objetos em DataSnap 2010</a></li><li><a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-array-de-strings-numbers-e-outros-tipos/" title="DataSnap 2010 – enviando e recebendo ARRAY de strings, numbers e outros tipos">DataSnap 2010 – enviando e recebendo ARRAY de strings, numbers e outros tipos</a></li><li><a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-objetos/" title="DataSnap 2010 – Enviando e recebendo objetos">DataSnap 2010 – Enviando e recebendo objetos</a></li><li><a href="http://www.andreanolanusse.com/pt/copyreadertoclientdataset-blob-e-a-mensagem-feature-not-implemented/" title="CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;">CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;</a></li><li><a href="http://www.andreanolanusse.com/pt/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class/" title="Publicando providers durante o registro dinâmico de DataSnap Server Class">Publicando providers durante o registro dinâmico de DataSnap Server Class</a></li></ul><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreanolanusse.com/pt/utilizando-callback-em-datasnap-2010/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>DataSnap 2010 – Enviando e recebendo objetos</title>
		<link>http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-objetos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=datasnap-2010-enviando-e-recebendo-objetos</link>
		<comments>http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-objetos/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 00:37:13 +0000</pubDate>
		<dc:creator>Andreano Lanusse</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[DataSnap]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.andreanolanusse.com/pt/?p=337</guid>
		<description><![CDATA[<p>Uma das perguntas frequentes dos usuários de Delphi 2009 e que utilizam DataSnap para criação de objetos é sobre a transferência de objetos entre cliente e servidor. No DataSnap 2009 estavamos limitados aos data types do dbxExpress, agora com o DataSnap 2010 que acompanha o Delphi 2010, isso é totalmente possível. DataSnap 2010 traz o [...]</p><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-311" href="http://www.andreanolanusse.com/pt/utilizando-atributos-attributes-para-criar-framework-objeto-relacional-em-delphi-2010-parte-1/delphiloho/"><img class="alignleft size-full wp-image-311" style="border: 0pt none; margin: 4px;" title="Delphi icon" src="http://www.andreanolanusse.com/pt/wp-content/uploads/2009/09/delphiloho.png" alt="Delphi icon" width="97" height="97" /></a>Uma das perguntas frequentes dos usuários de Delphi 2009 e que utilizam DataSnap para criação de objetos é sobre a transferência de objetos entre cliente e servidor. No DataSnap 2009 estavamos limitados aos data types do dbxExpress, agora com o DataSnap 2010 que acompanha o Delphi 2010, isso é totalmente possível.</p>
<p>DataSnap 2010 traz o suporte a <strong><a href="http://www.json.org/json-pt.html">JSON</a></strong> (JavaScript Object Notation) que é uma formatação leve de troca de dados, totalmente independente de linguagem, futuramente vou comentar mais sobre JSON e suas vantagens, para começar este post irá mostrar como transferir objetos entre cliente  e servidores DataSnap, sendo que ambos cliente e servidor são aplicações Delphi.</p>
<p>Para começar vamos definir uma classe chamada TCustomer.</p>
<pre class="brush: delphi">

unit Customer;

interface

uses
   DBXJSON, DBXJSONReflect, SysUtils;

type
   TMaritalStatus = (msMarried, msEngaged, msEligible);

TCustomer = class
    private
       FName: string;
       FAge: integer;
       FMaritalStatus: TMaritalStatus;
    public
        property Name: string read FName write FName;
        property Age: integer read FAge write FAge;
        property MaritalStatus: TMaritalStatus read FMaritalStatus write FMaritalStatus;

        function toString : string;override;
  end;</pre>
<p>Para transferir objetos em DataSnap estes devem descender the TJSONObject, no caso de não ser um objeto descendente você terá que utilizar as classes TJSONMarshal e TJSONUnMarshal para efetuar a transformação dos objetos. Sendo assim os métodos abaixo irão efetuar a conversão dos mesmos.</p>
<pre class="brush: delphi">

unit Customer;

  function CustomerToJSON(customer: TCustomer): TJSONValue;
  var
    m: TJSONMarshal;
  begin
    if Assigned(customer) then
    begin
      m := TJSONMarshal.Create(TJSONConverter.Create);
      try
        exit(m.Marshal(customer))
      finally
        m.Free;
      end;
    end
    else
      exit(TJSONNull.Create);
  end;

  function JSONToCustomer(json: TJSONValue): TCustomer;
  var
     unm: TJSONUnMarshal;
  begin
    if json is TJSONNull then
      exit(nil);
    unm := TJSONUnMarshal.Create;
    try
      exit(unm.Unmarshal(json) as TCustomer)
    finally
      unm.Free;
    end;
  end;</pre>
<p>Com isso temos classe TCustomer pronta para trafegar entre cliente e servidor, assim sendo basta implementar um Server Method que retorne um TJSONValue a partir da transformação de TCustomer, como o exemplo abaixo.</p>
<pre class="brush: delphi">

// protected
function TServerMethods.GetCustomer: TCustomer;
begin
  Result := TCustomer.Create;
  Result.Name := 'Pedro';
  Result.Age := 30;
  Result.MaritalStatus := msEligible;
end;

// public
function TServerMethods.GetJSONCustomer(): TJSONValue;
var
  myCustomer: TCustomer;
begin
  myCustomer := GetCustomer;
  Result := CustomerToJSON(myCustomer);
  myCustomer.Free;
end;</pre>
<p>No lado cliente ao executar o método GetJSONCustomer será necessário efetuar a transformação de TJSONValue para TCustomer, utilizando o método JSONToCustomer.</p>
<pre class="brush: delphi">

var
  proxy: TServerMethodsClient;
  myJSONCustomer: TCustomer;
begin

  try
    proxy := TServerMethodsClient.Create(SQLConnection1.DBXConnection);
    myJSONCustomer := JSONToCustomer(proxy.myJSONCustomer);

    Button1.Caption := myJSONCustomer.ToString;
    myJSONCustomer.Free;
  finally
    SQLConnection1.CloneConnection;
    proxy.Free;
  end;
end;</pre>
<p>Muito mais pode ser feito, como retornar Arrays de objetos, classes mais complexas, etc. Estarei abordando estes temas em futuros posts.</p>
<p>Download do <a href="http://cc.embarcadero.com/Download.aspx?id=27361">código fonte</a></p>
<h2  class="related_post_title">Posts relacionados</h2><ul class="related_post"><li><a href="http://www.andreanolanusse.com/pt/apresentacoes-do-delphi-conference-2010-disponivel-para-download/" title="Apresentações do Delphi Conference 2010 disponível para download">Apresentações do Delphi Conference 2010 disponível para download</a></li><li><a href="http://www.andreanolanusse.com/pt/utilizando-generics-para-transformacao-generica-de-objetos-em-datasnap-2010/" title="Utilizando generics para transformação genérica de Objetos em DataSnap 2010">Utilizando generics para transformação genérica de Objetos em DataSnap 2010</a></li><li><a href="http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-array-de-strings-numbers-e-outros-tipos/" title="DataSnap 2010 – enviando e recebendo ARRAY de strings, numbers e outros tipos">DataSnap 2010 – enviando e recebendo ARRAY de strings, numbers e outros tipos</a></li><li><a href="http://www.andreanolanusse.com/pt/utilizando-callback-em-datasnap-2010/" title="Utilizando callback em DataSnap 2010">Utilizando callback em DataSnap 2010</a></li><li><a href="http://www.andreanolanusse.com/pt/copyreadertoclientdataset-blob-e-a-mensagem-feature-not-implemented/" title="CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;">CopyReaderToClientDataSet, Blob e a mensagem &#8220;Feature not implemented&#8221;</a></li><li><a href="http://www.andreanolanusse.com/pt/publicando-providers-durante-o-registro-dinamico-de-datasnap-server-class/" title="Publicando providers durante o registro dinâmico de DataSnap Server Class">Publicando providers durante o registro dinâmico de DataSnap Server Class</a></li></ul><p><a href="http://www.andreanolanusse.com/pt">Andreano Lanusse | Tecnologia e Desenvolvimento de Software</a><br/>
Follow me on Twitter: <a href="http://twitter.com/andreanolanusse.com">@andreanolanusse</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreanolanusse.com/pt/datasnap-2010-enviando-e-recebendo-objetos/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		</item>
	</channel>
</rss>

