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 Box
  • Giovani Da Cruz
  • 34.223 views
  • 12 comentários
  • 24 de março de 2017

Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!

12 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
    —————————

  6. Magno disse:

    Estou com o mesmo problema do cleber

  7. Fabrício Medeiros disse:

    Estou usando o XE 8, para mim aparece a mensagem ‘Invalid Class TypeCast’. Alguém sabe o que seria ? O Json que estou tentando converter é :

    {“success”:[{“codativ”:”3″,”ramo”:”TESTES”},{“codativ”:”4″,”ramo”:”FABRÍCIO”},{“codativ”:”1″,”ramo”:”INDUSTRIA”},{“codativ”:”2″,”ramo”:”VAREJISTA”}]}

    Esse Json é fornecido por terceiros.

  8. Maria das Graças disse:

    Estou com o problema de ‘Invalid Class TypeCast’ quando o Json retorna apenas uma ocorrencia. Por exemplo, quando consulto um produto pelo id

  9. Alexandre Becker disse:

    estou com o erro do json ser maior que 255, como comentou disse para criar o campo antes o que não estou conseguindo, teria por favor algum exemplo?

  10. CLEYTON disse:

    @Elias
    na linha 40 deixe assim “JObj: TJSONValue;”
    e na linha 48 deixe assim “JObj := TJSONObject.ParseJSONValue(aJSON);”
    eu estava com o mesmo erro no Delphi Rio

  11. Eduardo disse:

    Amigos estou usando mysql, quando executo esta limpando a tabela e inserindo um novo registro.. então não esta adicionando um novo registro.. Alguém tem alguma ideia do que pode estar acontecendo.. Será que é problema no Banco de Dados?

Deixe um comentário

Ir ao topo

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