



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!
Você precisa fazer o login para publicar um comentário.
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?