Nesse artigo vou mostrar como é fácil transformar dados recebidos via JSON e inseri-los em um ClientDatSet. Vale ressaltar que o JSON que vamos tratar não é um JSON gerado pelo Delphi, o que seria muito mais fácil de fazer usando a classe TJsonMarschal eTJsonUnMarschal.
Para Começar vamos criar um projeto novo “DataSnap REST Application”
Nas opções que seguem escola “VCL Stand-alone Application” avance, escolha uma porta valida (8080 por padrão, mas pode mudar se quiser) avance de novo, na tela seguinte deixe como está e avance novamente, marque a opção TDSServerModule, e por ultimo defina onde vai salvar o projeto.
Agora vamos codificar o projeto, na “ServerMethodsUnit1” declare os seguintes métodos
TServerMethods1 = class(TDSServerModule)
cdsEmpresa: TClientDataSet;
private
{ Private declarations }
procedure JsonParaCds(_ACds: TClientDataSet; _AJson: TJSONValue);
function CdsParaJson(_ACds: TClientDataSet): TJSONArray;
public
{ Public declarations }
procedure InserirRegistro(_AJson: TJSONValue);
function BuscarRegistros: TJSONArray;
end;
Dentro do Server Modulo adicione um ClientDatSet, de o nome a ele de cdsEmpresa e associe a tabela customer das base de exemplos em que vem junto como delphi, geralmente está no caminho “c:\Program Files (x86)\Common Files\CodeGear Shared\Data\customer.xml”. Adicione todos os fileds no Fields Editor do Client.
Agora vamos codificar a mágica. De um Ctrl+Shift+C na classe para gerar a implementação do método.
Primeiro o método InserirRegistro que vai receber o Json com as informações que devem ser gravadas no XML.
Claro que poderia ser feito uma base em firebird pra salvar os dados, mas assim é mais simples.
procedure TServerMethods1.InserirRegistro(_AJson: TJSONValue);
begin
cdsEmpresa.Insert;
JsonParaCds(cdsEmpresa, _AJson);
cdsEmpresa.Post;
cdsEmpresa.SaveToFile('C:\customer.xml', dfXML); // salva um arquivo xml
end;
Agora o método que joga o json para o ClientDataSet
procedure TServerMethods1.JsonParaCds(_ACds: TClientDataSet; _AJson: TJSONValue);
var
AJsonObject, AJsonSubObj: TJSONObject;
AJsonPair, AJsonSubPair: TJSONPair;
AJsonArray: TJSONArray;
J, I: Integer;
AField: TField;
begin
AJsonObject := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(_AJson.ToString), 0) as TJSONObject;
AJsonPair := AJsonObject.Get(0);
AJsonArray := (AJsonPair.JsonValue as TJSONArray);
for I := 0 to AJsonArray.Size - 1 do
begin
AJsonSubObj := TJSONObject(AJsonArray.Get(I));
for J := 0 to AJsonSubObj.Size - 1 do
begin
AJsonSubPair := AJsonSubObj.Get(J);
AField := _ACds.FindField(AJsonSubPair.JsonString.Value);
if Assigned(AField) then
AField.Value := AJsonSubPair.JsonValue.Value;
end;
end;
end;
Vamos ao método que BuscarRegistros
function TServerMethods1.BuscarRegistros: TJSONArray;
begin
if not cdsEmpresa.Active then
cdsEmpresa.CreateDataSet;
Result := CdsParaJson(cdsEmpresa);
end;
E por ultimo e não menos importante o método que converte o CDS para um Json
function TServerMethods1.CdsParaJson(_ACds: TClientDataSet): TJSONArray;
var
AJsonObject: TJSONObject;
I: Integer;
begin
Result := TJSONArray.Create;
_ACds.First;
while not _ACds.Eof do
begin
AJsonObject := TJSONObject.Create;
for I := 0 to _ACds.FieldCount - 1 do
begin
AJsonObject.AddPair(_ACds.Fields[I].FieldName, _ACds.Fields[I].AsString);
end;
Result.AddElement(AJsonObject);
_ACds.Next;
end;
end;
Para testar o codigo execute o servidor.
Clic em Start;
Clic em OpenBrowser
Na pagina que se abre clique em Server Functions;
Expanda o botão a esquerda de “TServerMethods1″
Depois expanda o botão a esquerda de “BuscarRegistros” e clic em executar;
Após isso deve vir varios registros em formato Json no rodapé da pagina. esse são os dados que estão no clientDatSet;
Para inserir um registro expanda o botão a esquerda de “InserirRegistro”;
Coloque a seguinte linha no campo que aparece
{"result":[{"CustNo":"98989898","Company":"Rafael Pasa","Addr1":"Av Brasil","Addr2":"951","City":"Maravilha ","State":"SC","Zip":"94766-1234","Country":"BR","Phone":"808-555-0269","FAX":"808-555-0278","TaxRate":"8,5","Contact":"Rafael Pasa","LastInvoiceDate":"02/02/1995 01:05:03"}]}
E clic em executar
Depois abra o arquivo “c:\customer.xml” e procure por Rafael Pasa veras que foi inserido no client e salvo no XML.
Segue abaixo o fonte completo.
rafaelpasa.com.br/JsonToCDS.zip
Abraço






