Montar JSON em Delphi

Delphi

JSON

24/02/2017

Oi pessoal, tudo bem?

Como posso fazer este JSON em Delphi?

Obrigado!

{ "InformacoesConta": { "Contas": { "Contas": [ { "Info1": "8595", "Info2": "2959", "Info3": 0, "Info4": 51, "Info5": "30/11/2015", "Info6": "XSPWXG KPIUODEHYZB 15112463481", "Info7": 211.57, "Info8": "GODOFREDO R", "Info9": "201", "Info10": "FID", "Info11": "BLUBLU", "Info12": "JS", "Info13": "1542154", "Info14": "C", "Info15": "C" } ] }, "Status": "OK" } }
Fernando Tremonti

Fernando Tremonti

Curtidas 0

Melhor post

Gutierry Pereira

Gutierry Pereira

01/03/2017

Boa tarde,
Dessa forma acho que pode ficar um pouco confuso para manutenção, outra coisa que seus JSON não parece estar muito bem estruturado, inclusive o primeiro que passou como exemplo.
Uma dica seria você organizar em classes e gerar um json a partir dela:

  TEnderecoDTO = class
    private
      FLogradouro : String;
      FNumero     : String;
      FBairro     : String;
      FCep        : String;
      FCidade     : String;
      FEstado     : String;
    published
      property Logradouro : String read FLogradouro write FLogradouro;
      property Numero     : String read FNumero     write FNumero    ;
      property Bairro     : String read FBairro     write FBairro    ;
      property Cep        : String read FCep        write FCep       ;
      property Cidade     : String read FCidade     write FCidade    ;
      property Estado     : String read FEstado     write FEstado    ;
  end;

  TInformacoesContasDTO = class
    private
      fInfo1 : String;
      fInfo2 : String;
      fInfo3 : String;
      fInfo4 : String;
    published
      property Info1 : String read fInfo1 write fInfo1 ;
      property Info2 : String read fInfo2 write fInfo2 ;
      property Info3 : String read fInfo3 write fInfo3 ;
      property Info4 : String read fInfo4 write fInfo4 ;
  end;

  TArrayInformacoesContasDTO = array of TInformacoesContasDTO;

  TCooperadoDTO = class
    private
      FCnpjCooperativa    : String;
      FDocumentoCooperado : String;
      //...
      FEndereco           : TEnderecoDTO;
      FContas             : TArrayInformacoesContasDTO;
    published
      property CnpjCooperativa    : String                     read FCnpjCooperativa    write FCnpjCooperativa    ;
      property DocumentoCooperado : String                     read FDocumentoCooperado write FDocumentoCooperado ;
      //...
      property Endereco           : TEnderecoDTO               read FEndereco           write FEndereco           ;
      property Contas             : TArrayInformacoesContasDTO read FContas             write FContas             ;
  end;



Para gerar o JSON basta fazer assim agora:

var
  CooperadoDTO : TCooperadoDTO;
  Endereco     : TEnderecoDTO;
  Informacoes  : TArrayInformacoesContasDTO;
  Informacao   : TInformacoesContasDTO;

  json         : TStringList;
begin

  json         := TStringList.Create;
  CooperadoDTO := TCooperadoDTO.Create;
  Endereco     := TEnderecoDTO.Create;
  try
    CooperadoDTO.CnpjCooperativa    := '123456789';
    CooperadoDTO.DocumentoCooperado := 'lbalbalbalba';

    Endereco.Numero     := '123';
    Endereco.Logradouro := 'Rua 12 bla';
    Endereco.Cep        := '99999999'  ;
    Endereco.Bairro     := 'Meu Bairro';
    Endereco.Cidade     := 'City 2000' ;
    Endereco.Estado     := 'UF'        ;

    CooperadoDTO.Endereco           := Endereco;

    SetLength(Informacoes,2);

    Informacao   := TInformacoesContasDTO.Create;
    Informacao.fInfo1 := '1.00-01';
    Informacao.fInfo2 := '1.00-02';
    Informacao.fInfo3 := '1.00-03';
    Informacao.fInfo4 := '1.00-04';

    Informacoes[0] := Informacao;

    Informacao   := TInformacoesContasDTO.Create;
    Informacao.fInfo1 := '2.00-01';
    Informacao.fInfo2 := '2.00-02';
    Informacao.fInfo3 := '2.00-03';
    Informacao.fInfo4 := '2.00-04';

    Informacoes[1] := Informacao;

    CooperadoDTO.Contas := Informacoes;

    json.Text := TJson.ObjectToJsonString(CooperadoDTO);
    json.SaveToFile('<caminho_onde_deseja_salvar>');
  finally
    FreeAndNil(Endereco);
    FreeAndNil(CooperadoDTO);
    FreeAndNil(json);
  end;
end;


Declare a unit Rest.Json no uses.

Dessa forma seu resultado será semelhante a isso:
{
"cnpjCooperativa": "123456789",
"documentoCooperado": "lbalbalbalba",
"endereco": {
"logradouro": "Rua 12 bla",
"numero": "123",
"bairro": "Meu Bairro",
"cep": "99999999",
"cidade": "City 2000",
"estado": "UF"
},
"contas": [{
"info1": "1.00-01",
"info2": "1.00-02",
"info3": "1.00-03",
"info4": "1.00-04"
}, {
"info1": "2.00-01",
"info2": "2.00-02",
"info3": "2.00-03",
"info4": "2.00-04"
}]
}

Espero que tenha ajudado.

Abraços
GOSTEI 9

Mais Respostas

Gutierry Pereira

Gutierry Pereira

24/02/2017

1 - Você pode criar um objeto representante, sendo ele um o objeto da classe de InformacoesContas onde tem um array ou coleção de contas e usar a classe TJSONObject para converter a string em um objeto.

2 - Pode simplpemente fazer um parser da string com uso da classe TJSONObject e acessar os valores desejados através do método getValue.
GOSTEI 1
Fernando Tremonti

Fernando Tremonti

24/02/2017

Fiz algo neste sentido,

Mas a estrutura não ficou igual:

      LJsonObject := TJSONObject.Create;
      LInfoContas := TJSONArray.Create;
      LContas     := TJSONArray.Create;

      while not Eof do
      begin
        LJson := TJSONObject.Create;
        LJson.AddPair(TJSONPair.Create('CnpjCooperativa'  , TJSONString.Create(FieldByName('CNPJCOOPERATIVA').Value )));
        LJson.AddPair(TJSONPair.Create('DocumentoCooperado', TJSONString.Create(FieldByName('nrCpfCnpj').Value )));
        LJson.AddPair(TJSONPair.Create('AgenciaCooperado' , TJSONNumber.Create(FieldByName('AgenciaCooperado').Value )));
        LJson.AddPair(TJSONPair.Create('ContaCooperado' , TJSONNumber.Create(FieldByName('ContaCooperado').Value )));
        LJson.AddPair(TJSONPair.Create('ContaDesde'     , TJSONString.Create(DateToStr(FieldByName('ContaDesde').Value) )));
        LJson.AddPair(TJSONPair.Create('NomeCooperado'  , TJSONString.Create(FieldByName('NmPrimTl').Value )));
        LJson.AddPair(TJSONPair.Create('SaldoDisponivel', TJSONNumber.Create(FieldByName('SaldoDisponivel').Value )));
        LJson.AddPair(TJSONPair.Create('Logradouro'     , TJSONString.Create(FieldByName('dsEndere').Value )));
        LJson.AddPair(TJSONPair.Create('Numero'         , TJSONString.Create(FieldByName('numero').Value )));
        LJson.AddPair(TJSONPair.Create('Bairro'         , TJSONString.Create(FieldByName('nmbairro').Value )));
        LJson.AddPair(TJSONPair.Create('Cidade'         , TJSONString.Create(FieldByName('nmCidade').Value )));
        LJson.AddPair(TJSONPair.Create('Estado'         , TJSONString.Create(FieldByName('cdUFEnd').Value )));
        LJson.AddPair(TJSONPair.Create('Cep'            , TJSONString.Create(FieldByName('nrCEPEnd').Value )));
        LJson.AddPair(TJSONPair.Create('TipoProduto'    , TJSONString.Create(FieldByName('TipoProduto').Value )));
        LJson.AddPair(TJSONPair.Create('StatusCooperado', TJSONString.Create(FieldByName('StatusCooperado').Value )));
        LContas.Add(LJson);
        Next;
      end;

      LJsonObject.AddPair(TJSONPair.Create('InformacoesContas', LContas ));

      result := LJsonObject;
    end;
GOSTEI 0
Ruy Caribé

Ruy Caribé

24/02/2017

Boa tarde,
Dessa forma acho que pode ficar um pouco confuso para manutenção, outra coisa que seus JSON não parece estar muito bem estruturado, inclusive o primeiro que passou como exemplo.
Uma dica seria você organizar em classes e gerar um json a partir dela:

  TEnderecoDTO = class
    private
      FLogradouro : String;
      FNumero     : String;
      FBairro     : String;
      FCep        : String;
      FCidade     : String;
      FEstado     : String;
    published
      property Logradouro : String read FLogradouro write FLogradouro;
      property Numero     : String read FNumero     write FNumero    ;
      property Bairro     : String read FBairro     write FBairro    ;
      property Cep        : String read FCep        write FCep       ;
      property Cidade     : String read FCidade     write FCidade    ;
      property Estado     : String read FEstado     write FEstado    ;
  end;

  TInformacoesContasDTO = class
    private
      fInfo1 : String;
      fInfo2 : String;
      fInfo3 : String;
      fInfo4 : String;
    published
      property Info1 : String read fInfo1 write fInfo1 ;
      property Info2 : String read fInfo2 write fInfo2 ;
      property Info3 : String read fInfo3 write fInfo3 ;
      property Info4 : String read fInfo4 write fInfo4 ;
  end;

  TArrayInformacoesContasDTO = array of TInformacoesContasDTO;

  TCooperadoDTO = class
    private
      FCnpjCooperativa    : String;
      FDocumentoCooperado : String;
      //...
      FEndereco           : TEnderecoDTO;
      FContas             : TArrayInformacoesContasDTO;
    published
      property CnpjCooperativa    : String                     read FCnpjCooperativa    write FCnpjCooperativa    ;
      property DocumentoCooperado : String                     read FDocumentoCooperado write FDocumentoCooperado ;
      //...
      property Endereco           : TEnderecoDTO               read FEndereco           write FEndereco           ;
      property Contas             : TArrayInformacoesContasDTO read FContas             write FContas             ;
  end;



Para gerar o JSON basta fazer assim agora:

var
  CooperadoDTO : TCooperadoDTO;
  Endereco     : TEnderecoDTO;
  Informacoes  : TArrayInformacoesContasDTO;
  Informacao   : TInformacoesContasDTO;

  json         : TStringList;
begin

  json         := TStringList.Create;
  CooperadoDTO := TCooperadoDTO.Create;
  Endereco     := TEnderecoDTO.Create;
  try
    CooperadoDTO.CnpjCooperativa    := ''123456789'';
    CooperadoDTO.DocumentoCooperado := ''lbalbalbalba'';

    Endereco.Numero     := ''123'';
    Endereco.Logradouro := ''Rua 12 bla'';
    Endereco.Cep        := ''99999999''  ;
    Endereco.Bairro     := ''Meu Bairro'';
    Endereco.Cidade     := ''City 2000'' ;
    Endereco.Estado     := ''UF''        ;

    CooperadoDTO.Endereco           := Endereco;

    SetLength(Informacoes,2);

    Informacao   := TInformacoesContasDTO.Create;
    Informacao.fInfo1 := ''1.00-01'';
    Informacao.fInfo2 := ''1.00-02'';
    Informacao.fInfo3 := ''1.00-03'';
    Informacao.fInfo4 := ''1.00-04'';

    Informacoes[0] := Informacao;

    Informacao   := TInformacoesContasDTO.Create;
    Informacao.fInfo1 := ''2.00-01'';
    Informacao.fInfo2 := ''2.00-02'';
    Informacao.fInfo3 := ''2.00-03'';
    Informacao.fInfo4 := ''2.00-04'';

    Informacoes[1] := Informacao;

    CooperadoDTO.Contas := Informacoes;

    json.Text := TJson.ObjectToJsonString(CooperadoDTO);
    json.SaveToFile(''<caminho_onde_deseja_salvar>'');
  finally
    FreeAndNil(Endereco);
    FreeAndNil(CooperadoDTO);
    FreeAndNil(json);
  end;
end;


Declare a unit Rest.Json no uses.

Dessa forma seu resultado será semelhante a isso:
{
"cnpjCooperativa": "123456789",
"documentoCooperado": "lbalbalbalba",
"endereco": {
"logradouro": "Rua 12 bla",
"numero": "123",
"bairro": "Meu Bairro",
"cep": "99999999",
"cidade": "City 2000",
"estado": "UF"
},
"contas": [{
"info1": "1.00-01",
"info2": "1.00-02",
"info3": "1.00-03",
"info4": "1.00-04"
}, {
"info1": "2.00-01",
"info2": "2.00-02",
"info3": "2.00-03",
"info4": "2.00-04"
}]
}

Espero que tenha ajudado.

Abraços

Boa tarde, como faço pra entrar em contato com você? meu skype ruicaribe @ gmail .com
GOSTEI 0
Ruy Caribé

Ruy Caribé

24/02/2017

Boa tarde, como faço pra entrar em contato com você? meu skype ruicaribe @ gmail .com
GOSTEI 0
Fábio Valente

Fábio Valente

24/02/2017

Cara, segui o seu exemplo e funcionou perfeitamente para o que precisava! Muito obrigado pela colaboração com a comunidade!
GOSTEI 1
Daniel Pavan

Daniel Pavan

24/02/2017

Boa Noite Gutierry Pereira!

Sei que o Post é antigo, mas me interessei muito pela transparência pela qual são geradas as informações para o json com a utilização de classes.
Porém, veja se consegue me ajudar.
Estou usando RAD Studio XE 8.0 e não consigo declarar a uses REST.Json.
Para testar seu exemplo Criei uma nova aplicação "VCL Forms Application - Delphi".

Desde já agradeço se puder me orientar.

Grande Agraço!

Daniel

Boa tarde,
Dessa forma acho que pode ficar um pouco confuso para manutenção, outra coisa que seus JSON não parece estar muito bem estruturado, inclusive o primeiro que passou como exemplo.
Uma dica seria você organizar em classes e gerar um json a partir dela:

  TEnderecoDTO = class
    private
      FLogradouro : String;
      FNumero     : String;
      FBairro     : String;
      FCep        : String;
      FCidade     : String;
      FEstado     : String;
    published
      property Logradouro : String read FLogradouro write FLogradouro;
      property Numero     : String read FNumero     write FNumero    ;
      property Bairro     : String read FBairro     write FBairro    ;
      property Cep        : String read FCep        write FCep       ;
      property Cidade     : String read FCidade     write FCidade    ;
      property Estado     : String read FEstado     write FEstado    ;
  end;

  TInformacoesContasDTO = class
    private
      fInfo1 : String;
      fInfo2 : String;
      fInfo3 : String;
      fInfo4 : String;
    published
      property Info1 : String read fInfo1 write fInfo1 ;
      property Info2 : String read fInfo2 write fInfo2 ;
      property Info3 : String read fInfo3 write fInfo3 ;
      property Info4 : String read fInfo4 write fInfo4 ;
  end;

  TArrayInformacoesContasDTO = array of TInformacoesContasDTO;

  TCooperadoDTO = class
    private
      FCnpjCooperativa    : String;
      FDocumentoCooperado : String;
      //...
      FEndereco           : TEnderecoDTO;
      FContas             : TArrayInformacoesContasDTO;
    published
      property CnpjCooperativa    : String                     read FCnpjCooperativa    write FCnpjCooperativa    ;
      property DocumentoCooperado : String                     read FDocumentoCooperado write FDocumentoCooperado ;
      //...
      property Endereco           : TEnderecoDTO               read FEndereco           write FEndereco           ;
      property Contas             : TArrayInformacoesContasDTO read FContas             write FContas             ;
  end;



Para gerar o JSON basta fazer assim agora:

var
  CooperadoDTO : TCooperadoDTO;
  Endereco     : TEnderecoDTO;
  Informacoes  : TArrayInformacoesContasDTO;
  Informacao   : TInformacoesContasDTO;

  json         : TStringList;
begin

  json         := TStringList.Create;
  CooperadoDTO := TCooperadoDTO.Create;
  Endereco     := TEnderecoDTO.Create;
  try
    CooperadoDTO.CnpjCooperativa    := ''123456789'';
    CooperadoDTO.DocumentoCooperado := ''lbalbalbalba'';

    Endereco.Numero     := ''123'';
    Endereco.Logradouro := ''Rua 12 bla'';
    Endereco.Cep        := ''99999999''  ;
    Endereco.Bairro     := ''Meu Bairro'';
    Endereco.Cidade     := ''City 2000'' ;
    Endereco.Estado     := ''UF''        ;

    CooperadoDTO.Endereco           := Endereco;

    SetLength(Informacoes,2);

    Informacao   := TInformacoesContasDTO.Create;
    Informacao.fInfo1 := ''1.00-01'';
    Informacao.fInfo2 := ''1.00-02'';
    Informacao.fInfo3 := ''1.00-03'';
    Informacao.fInfo4 := ''1.00-04'';

    Informacoes[0] := Informacao;

    Informacao   := TInformacoesContasDTO.Create;
    Informacao.fInfo1 := ''2.00-01'';
    Informacao.fInfo2 := ''2.00-02'';
    Informacao.fInfo3 := ''2.00-03'';
    Informacao.fInfo4 := ''2.00-04'';

    Informacoes[1] := Informacao;

    CooperadoDTO.Contas := Informacoes;

    json.Text := TJson.ObjectToJsonString(CooperadoDTO);
    json.SaveToFile(''<caminho_onde_deseja_salvar>'');
  finally
    FreeAndNil(Endereco);
    FreeAndNil(CooperadoDTO);
    FreeAndNil(json);
  end;
end;


Declare a unit Rest.Json no uses.

Dessa forma seu resultado será semelhante a isso:
{
"cnpjCooperativa": "123456789",
"documentoCooperado": "lbalbalbalba",
"endereco": {
"logradouro": "Rua 12 bla",
"numero": "123",
"bairro": "Meu Bairro",
"cep": "99999999",
"cidade": "City 2000",
"estado": "UF"
},
"contas": [{
"info1": "1.00-01",
"info2": "1.00-02",
"info3": "1.00-03",
"info4": "1.00-04"
}, {
"info1": "2.00-01",
"info2": "2.00-02",
"info3": "2.00-03",
"info4": "2.00-04"
}]
}

Espero que tenha ajudado.

Abraços
GOSTEI 0
Jose Silva

Jose Silva

24/02/2017

Boa tarde,
Dessa forma acho que pode ficar um pouco confuso para manutenção, outra coisa que seus JSON não parece estar muito bem estruturado, inclusive o primeiro que passou como exemplo.
Uma dica seria você organizar em classes e gerar um json a partir dela:

  TEnderecoDTO = class
    private
      FLogradouro : String;
      FNumero     : String;
      FBairro     : String;
      FCep        : String;
      FCidade     : String;
      FEstado     : String;
    published
      property Logradouro : String read FLogradouro write FLogradouro;
      property Numero     : String read FNumero     write FNumero    ;
      property Bairro     : String read FBairro     write FBairro    ;
      property Cep        : String read FCep        write FCep       ;
      property Cidade     : String read FCidade     write FCidade    ;
      property Estado     : String read FEstado     write FEstado    ;
  end;

  TInformacoesContasDTO = class
    private
      fInfo1 : String;
      fInfo2 : String;
      fInfo3 : String;
      fInfo4 : String;
    published
      property Info1 : String read fInfo1 write fInfo1 ;
      property Info2 : String read fInfo2 write fInfo2 ;
      property Info3 : String read fInfo3 write fInfo3 ;
      property Info4 : String read fInfo4 write fInfo4 ;
  end;

  TArrayInformacoesContasDTO = array of TInformacoesContasDTO;

  TCooperadoDTO = class
    private
      FCnpjCooperativa    : String;
      FDocumentoCooperado : String;
      //...
      FEndereco           : TEnderecoDTO;
      FContas             : TArrayInformacoesContasDTO;
    published
      property CnpjCooperativa    : String                     read FCnpjCooperativa    write FCnpjCooperativa    ;
      property DocumentoCooperado : String                     read FDocumentoCooperado write FDocumentoCooperado ;
      //...
      property Endereco           : TEnderecoDTO               read FEndereco           write FEndereco           ;
      property Contas             : TArrayInformacoesContasDTO read FContas             write FContas             ;
  end;



Para gerar o JSON basta fazer assim agora:

var
  CooperadoDTO : TCooperadoDTO;
  Endereco     : TEnderecoDTO;
  Informacoes  : TArrayInformacoesContasDTO;
  Informacao   : TInformacoesContasDTO;

  json         : TStringList;
begin

  json         := TStringList.Create;
  CooperadoDTO := TCooperadoDTO.Create;
  Endereco     := TEnderecoDTO.Create;
  try
    CooperadoDTO.CnpjCooperativa    := '123456789';
    CooperadoDTO.DocumentoCooperado := 'lbalbalbalba';

    Endereco.Numero     := '123';
    Endereco.Logradouro := 'Rua 12 bla';
    Endereco.Cep        := '99999999'  ;
    Endereco.Bairro     := 'Meu Bairro';
    Endereco.Cidade     := 'City 2000' ;
    Endereco.Estado     := 'UF'        ;

    CooperadoDTO.Endereco           := Endereco;

    SetLength(Informacoes,2);

    Informacao   := TInformacoesContasDTO.Create;
    Informacao.fInfo1 := '1.00-01';
    Informacao.fInfo2 := '1.00-02';
    Informacao.fInfo3 := '1.00-03';
    Informacao.fInfo4 := '1.00-04';

    Informacoes[0] := Informacao;

    Informacao   := TInformacoesContasDTO.Create;
    Informacao.fInfo1 := '2.00-01';
    Informacao.fInfo2 := '2.00-02';
    Informacao.fInfo3 := '2.00-03';
    Informacao.fInfo4 := '2.00-04';

    Informacoes[1] := Informacao;

    CooperadoDTO.Contas := Informacoes;

    json.Text := TJson.ObjectToJsonString(CooperadoDTO);
    json.SaveToFile('<caminho_onde_deseja_salvar>');
  finally
    FreeAndNil(Endereco);
    FreeAndNil(CooperadoDTO);
    FreeAndNil(json);
  end;
end;


Declare a unit Rest.Json no uses.

Dessa forma seu resultado será semelhante a isso:
{
"cnpjCooperativa": "123456789",
"documentoCooperado": "lbalbalbalba",
"endereco": {
"logradouro": "Rua 12 bla",
"numero": "123",
"bairro": "Meu Bairro",
"cep": "99999999",
"cidade": "City 2000",
"estado": "UF"
},
"contas": [{
"info1": "1.00-01",
"info2": "1.00-02",
"info3": "1.00-03",
"info4": "1.00-04"
}, {
"info1": "2.00-01",
"info2": "2.00-02",
"info3": "2.00-03",
"info4": "2.00-04"
}]
}

Espero que tenha ajudado.

Abraços


Achei muito bom isso. Ainda não manipulei arquivos JSON com Delphi, mas é bacana saber que pode ser feito desta forma, o reaproveitamento da classe é muito vantajoso.
GOSTEI 0
POSTAR