<?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>Thu, 17 May 2012 19:34:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader</title>
		<link>http://www.andreanolanusse.com/pt/tdbxjsontools-copiarconverter-dados-entre-tdataset-tjsonobject-dbxreader/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tdbxjsontools-copiarconverter-dados-entre-tdataset-tjsonobject-dbxreader</link>
		<comments>http://www.andreanolanusse.com/pt/tdbxjsontools-copiarconverter-dados-entre-tdataset-tjsonobject-dbxreader/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 09:35:10 +0000</pubDate>
		<dc:creator>Andreano Lanusse</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[FireMonkey]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.andreanolanusse.com/pt/?p=1478</guid>
		<description><![CDATA[<p>Você pode copiar os dados de um DBXReader para um ClientDataSet e vice-versa utilizando o dbxExpress framework, provavelmente você já leu alguns dos meus  artigos aqui no blog onde explico como isso funciona em aplicações desktop, entretanto em plataformas móveis não temos o ClientDataSet e quando buscamos algo similar vem a pergunta, o que fazer? DataSnap [...]</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>Você pode copiar os dados de um DBXReader para um ClientDataSet e vice-versa utilizando o dbxExpress framework, provavelmente você já leu alguns dos meus  <a title="Copiando estrutura e dados de um DBXReader para ClientDataSet – DataSnap 2010" href="http://www.andreanolanusse.com/pt/copiando-estrutura-e-dados-de-um-dbxreader-para-clientdataset-datasnap-2010/" target="_blank">artigos</a> aqui no blog onde explico como isso funciona em aplicações desktop, entretanto em plataformas móveis não temos o ClientDataSet e quando buscamos algo similar vem a pergunta, o que fazer?</p>
<p>DataSnap Mobile Connectors tem um classe chamada TDBXJsonTools que permite a copia e conversão de dados entre DBXReader, TJSONObject, DBXReader e outros tipos de dados, pode ser utilizada em qualquer plataforma suportada pelos conectores, como: Java/Android, Java/BlackBerry, Objective-C, C#/Windows Phone e FreePascal.</p>
<p>Em aplicações desktop nativa utilizamos o TDBXDataSetReader.CopyReaderToClientDataSet(Reader, ClientDataSet) para copiar os dados do DBXReader para um ClientDataSet, no caso de aplicações móveis usamos TDBXJsonTools.CreateTDataSetFromJSON(DBXReader.asJSONObject).</p>
<p>Entretanto não estamos limitados a copia/conversão de dados, TDBXJsonTools traz maior flexibilidade na interação e transporte dos dados usando diferentes tipos de dados, além de usar o melhor dos tipos nativos em cada plataforma. Por exemplo, quando utilizamos DataSet em aplicações FireMonkey para iOS utilizamos a classe TDataSet que é parte da RTL do Delphi e FreePascal, já no caso de aplicações Java, TDataSet será uma extensão do TDBXReader e assim por diante.</p>
<p>DBXReader é unidirecional e com isso a navegação fica limitada, no entanto ao desenvolver aplicações FireMonkey para iOS você poderá copiar os dados do DBXReader para um DataSet que é bidirecional, isso irá permitir a navegação no DataSet e utilizar outros métodos do DataSet.</p>
<p>Abaixo a interface da classe TDBXJsonTools para FreePascal.</p>
<pre class="brush: delphi">  TDBXJsonTools = class
  public
    class procedure jsonToDBX(obj: TJSONValue; var value: TDBXValue; dbxTypeName: String);
    class procedure JSONToValueType(json: TJSONArray; var vt: TDBXValueType);
    class function DBXParametersToJSONObject(dbxParameters: TDSParams) : TJSONObject;
    class function DBXReaderToJSONObject(dbxReader: TDBXReader): TJSONObject;
    class function CreateTDataSetFromJSON(value: TJSONObject): TDataset;
    class function TDataSetToJSONObject(value: TDataset): TJSONObject;
    class function GetTFieldTypeByTDBXDataTypes(DBXDataTypes: TDBXDataTypes) : TFieldType;
    class function GetTDBXDataTypesByTFieldType(FieldType: TFieldType) : TDBXDataTypes;
    class function CreateTStreamFromJSONArray(value: TJSONArray): TStream;
    class function StreamToJSONArray(value: TStream): TJSONArray;
    class function JSONToTableType(value: TJSONValue; dbxTypeName: String): TObject;
    class function SerializeTableType(Objetc: TObject): TJSONObject;

  end;</pre>
<p>Eu continuo recomendando o uso do DBXReader como sua fonte principal de dados e quando necessário utilize os métodos da classe TDBXJsonTools.</p>
<h2  class="related_post_title">Posts relacionados</h2><ul class="related_post"><li><a href="http://www.andreanolanusse.com/pt/bye-bye-embarcadero/" title="Bye Bye Embarcadero">Bye Bye Embarcadero</a></li><li><a href="http://www.andreanolanusse.com/pt/video-desenvolvendo-para-ios-com-firemonkey-e-delphi-xe2/" title="Vídeo: Desenvolvendo para iOS com FireMonkey e Delphi XE2">Vídeo: Desenvolvendo para iOS com FireMonkey e Delphi XE2</a></li><li><a href="http://www.andreanolanusse.com/pt/video-desenvolvimento-para-ios-com-firemonkey/" title="Vídeo: Desenvolvimento para iOS com FireMonkey">Vídeo: Desenvolvimento para iOS com FireMonkey</a></li><li><a href="http://www.andreanolanusse.com/pt/disponibilizado-o-update-4-para-delphi-xe2-e-cbuilder-xe2/" title="Disponibilizado o Update 4 para Delphi XE2 e C++Builder XE2">Disponibilizado o Update 4 para Delphi XE2 e C++Builder XE2</a></li><li><a href="http://www.andreanolanusse.com/pt/desenvolvendo-o-firemonkey-3d-text-editor-para-windows-e-mac/" title="Desenvolvendo o FireMonkey 3D Text Editor para Windows e Mac">Desenvolvendo o FireMonkey 3D Text Editor para Windows e Mac</a></li><li><a href="http://www.andreanolanusse.com/pt/apresentacoes-do-delphi-conference-2011-disponivel-para-download/" title="Apresentações do Delphi Conference 2011 disponíveis para download">Apresentações do Delphi Conference 2011 disponíveis para download</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/tdbxjsontools-copiarconverter-dados-entre-tdataset-tjsonobject-dbxreader/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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"><br />
<img 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-aprenda-como-utilizar-datasnap-connectors-na-pratica/" title="Video: Aprenda como utilizar DataSnap Connectors na prática">Video: Aprenda como utilizar DataSnap Connectors na prática</a></li><li><a href="http://www.andreanolanusse.com/pt/video-desenvolvendo-para-ios-com-firemonkey-e-delphi-xe2/" title="Vídeo: Desenvolvendo para iOS com FireMonkey e Delphi XE2">Vídeo: Desenvolvendo para iOS com FireMonkey e Delphi XE2</a></li><li><a href="http://www.andreanolanusse.com/pt/video-desenvolvimento-para-ios-com-firemonkey/" title="Vídeo: Desenvolvimento para iOS com FireMonkey">Vídeo: Desenvolvimento para iOS com FireMonkey</a></li><li><a href="http://www.andreanolanusse.com/pt/tdbxjsontools-copiarconverter-dados-entre-tdataset-tjsonobject-dbxreader/" title="TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader">TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader</a></li><li><a href="http://www.andreanolanusse.com/pt/desenvolvendo-o-firemonkey-3d-text-editor-para-windows-e-mac/" title="Desenvolvendo o FireMonkey 3D Text Editor para Windows e Mac">Desenvolvendo o FireMonkey 3D Text Editor para Windows e Mac</a></li><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></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/video-aprenda-como-utilizar-datasnap-connectors-na-pratica/" title="Video: Aprenda como utilizar DataSnap Connectors na prática">Video: Aprenda como utilizar DataSnap Connectors na prática</a></li><li><a href="http://www.andreanolanusse.com/pt/tdbxjsontools-copiarconverter-dados-entre-tdataset-tjsonobject-dbxreader/" title="TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader">TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader</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/video-aprenda-como-utilizar-datasnap-connectors-na-pratica/" title="Video: Aprenda como utilizar DataSnap Connectors na prática">Video: Aprenda como utilizar DataSnap Connectors na prática</a></li><li><a href="http://www.andreanolanusse.com/pt/tdbxjsontools-copiarconverter-dados-entre-tdataset-tjsonobject-dbxreader/" title="TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader">TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader</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/video-aprenda-como-utilizar-datasnap-connectors-na-pratica/" title="Video: Aprenda como utilizar DataSnap Connectors na prática">Video: Aprenda como utilizar DataSnap Connectors na prática</a></li><li><a href="http://www.andreanolanusse.com/pt/tdbxjsontools-copiarconverter-dados-entre-tdataset-tjsonobject-dbxreader/" title="TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader">TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader</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>4</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/video-aprenda-como-utilizar-datasnap-connectors-na-pratica/" title="Video: Aprenda como utilizar DataSnap Connectors na prática">Video: Aprenda como utilizar DataSnap Connectors na prática</a></li><li><a href="http://www.andreanolanusse.com/pt/tdbxjsontools-copiarconverter-dados-entre-tdataset-tjsonobject-dbxreader/" title="TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader">TDBXJsonTools copiar/converter dados entre TDataSet &#8211; TJSONObject &#8211; DBXReader</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>49</slash:comments>
		</item>
	</channel>
</rss>

