Como converter Json para Dataset? – Show Delphi

DICAS

Visite a biblioteca de dicas da comunidade.

Saiba mais

ARTIGOS

Abordagens detalhadas sobre assuntos diversos.

Saiba mais

INICIANTES

Aprenda a programar de um modo simples e fácil.

Saiba mais

DOWNLOADS

Acesse os materiais exclusivos aos membros.

Saiba mais
voltar

PARA QUEM GOSTA DE DELPHI

Como converter Json para Dataset?





Super dica pessoal para quem esta trabalhando com JSON.

montei um método que simplifica e muito a conversão de um JSON
para um ClientDataSet ou FDMemTable, por exemplo.

Vamos direto ao assunto!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
uses
  REST.Response.Adapter, System.JSON;
 
procedure JsonToDataset(aDataset : TDataSet; aJSON : string);
var
  JObj: TJSONArray;
  vConv : TCustomJSONDataSetAdapter;
begin
  if (aJSON = EmptyStr) then
  begin
    Exit;
  end;
 
  JObj := TJSONObject.ParseJSONValue(aJSON) as TJSONArray;
  vConv := TCustomJSONDataSetAdapter.Create(Nil);
 
  try
    vConv.Dataset := aDataset;
    vConv.UpdateDataSet(JObj);
  finally
    vConv.Free;
    JObj.Free;
  end;
end;

Gostou? Veja o exemplo de como é fácil utilizar!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,
  FireDAC.DApt.Intf, Vcl.StdCtrls, Data.DB, FireDAC.Comp.DataSet,
  FireDAC.Comp.Client, Vcl.Grids, Vcl.DBGrids, Datasnap.DBClient;
 
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    DBGrid2: TDBGrid;
    DataSource2: TDataSource;
    FDMemTable1: TFDMemTable;
    Button1: TButton;
    ClientDataSet1: TClientDataSet;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses
  REST.Response.Adapter, System.JSON;
 
procedure JsonToDataset(aDataset : TDataSet; aJSON : string);
var
  JObj: TJSONArray;
  vConv : TCustomJSONDataSetAdapter;
begin
  if (aJSON = EmptyStr) then
  begin
    Exit;
  end;
 
  JObj := TJSONObject.ParseJSONValue(aJSON) as TJSONArray;
  vConv := TCustomJSONDataSetAdapter.Create(Nil);
 
  try
    vConv.Dataset := aDataset;
    vConv.UpdateDataSet(JObj);
  finally
    vConv.Free;
    JObj.Free;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  MEU_JSON =
  '[{'+
	'"Titulo": "Ate que a sorte nos separe",'+
	'"duracao": "120 min"'+
  '}, {'+
	'"Titulo": "Matrix",'+
	'"duracao": "140 min"'+
  '}]';
begin
  JsonToDataset(FDMemTable1, MEU_JSON);
  JsonToDataset(ClientDataSet1, MEU_JSON);
end;
 
end.

Testes do Delphi XE 7 até o Berlin 10.1 e deverá rodas em outras versões.

Por padrão o Delphi cria os Fields como WideString de 255 caracteres, a dica é
você criar os fields antes de fazer a conversão, então o delphi irá processar
de acordo com o tipo do field.

Sugestões? Dê o seu feedback nos comentários!

Facebook Comments

Posts Relacionados

  • Giovani Da Cruz
  • 6.564 views
  • 6 comentários
  • 24 de março de 2017

6 respostas para “Como converter Json para Dataset?”

  1. João disse:

    Tentei no delphi Berlin, mas houve problema com a REST.Response.Adapter. Ocorreu o seguinte erro : [dcc32 Fatal Error] REST.Json.pas(287): F2051 Unit REST.Client was compiled with a different version of REST.Json.TJson.

    Como resolver?

  2. welson coelho junior disse:

    esse exemplo para mim funcionou perfeitamente, mas só quando todos os Fields do CDS forem iguais aos Values do JSON, agora eu pergunto… se eu quiser colocar um campo no CDS que não esteja no JSON? aqui eu coloquei e deu erro.

    t+

  3. Cleber disse:

    Obrigado pelo exemplo! Poderia me ajudar com um problema?

    Ao gerar um CDS com dados grandes em um campo, a função Trunca o tamanho para 255 caracteres. Há alguma forma de contornar este problema?

  4. Cleber disse:

    Eu precisava que os fields fossem gerados dinamicamente para este meu projeto. Alguma ideia de como posso fazer?

  5. Elias disse:

    Eu tentei usar essa ideia mas não deu muito certo aqui. Tenho um webservise que me retorna o Json, carrego o resultado em um Memo, quando executo o método para converter para dataset dá o seguinte erro:

    —————————
    Debugger Exception Notification
    —————————
    Project teste.exe raised exception class EInvalidCast with message ‘Invalid class typecast’.
    —————————
    Break Continue Help
    —————————

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Ir ao topo

© 2018 Infus Soluções em Tecnologia - Todos os Direitos Reservados