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; |
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. |
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!
-
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!
Posts Relacionados - Continue Aprendendo
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?
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+
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?
Você pode definir no dataset os fields, conforme precisa,
depois é só usar a função normalmente.
Eu precisava que os fields fossem gerados dinamicamente para este meu projeto. Alguma ideia de como posso fazer?
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
—————————
Estou com o mesmo problema do cleber
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.
Estou com o problema de ‘Invalid Class TypeCast’ quando o Json retorna apenas uma ocorrencia. Por exemplo, quando consulto um produto pelo id
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?
@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
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?