JsonArray em Client Delphi

28/01/2016

103

Boa noite pessoal,

estou estudando servidor Datasnap com Delphi XE6 e me deparei com um problema.

Fiz um servidor utilizando Rest/Json.

E na aplicação Client utilizei o IdHTTP para coletar os dados.

No servidor tenho um método que retorna um JsonArray, ele está funcionando normal, pois consigo visualizar os dados via web acessando o método diretamente.

No Client eu uso o método IdHttp.Get('endereço do servidor', StringStream), o resultado armazeno em uma variável do tipo StringStream, o retorno ocorre com sucesso, porém gostaria de saber se teria como eu converter esse StringStrem em JsonArray novamente para eu poder fazer o UnMarshal e exibir os dados.

Os dados vou exibir em um DBGrid com ClientDataSet e DataSource
Responder

Post mais votado

29/01/2016

Amigo segue um exemplo simples, eu fiz em Delphi 2007 e utilizei a biblioteca LkJSON. Mas é apenas uma idéia para poder te ajudar ou abrir a mente para o seu problema. Aqui eu passo 2 parâmetros para o web services e ele me retorna um json.

Eu não estou usando ClientDataSet, mas fica muito simples você adaptar para armazenar o retorno. Veja:

procedure TForm.NomeProcedure(Param1,Param2:String);
Var
  i: integer;
  Consulta, ArrayObjetos: TStringList;
  Resposta: TStringStream;
  JSon: TlkJSONobject;
  JSArray: TlkJSONlist;
  Var1,Var2,Var3,Var4: TlkJSONbase;
begin
  ArrayObjetos := TStringList.Create;
  Consulta        := TStringList.Create;
  Resposta       := TStringStream.Create('');

  Consulta.Values['parametro1'] := Param1;
  Consulta.Values['parametro2'] := Param2

  IdHTTP1.Post(LinkdoWebService, Consulta, Resposta);    // utilizei o metodo POST 

  JSon := TlkJSON.ParseText(Resposta.DataString) as TlkJSONobject;
  Var1  := JSon.Field['variavel_1'];
  Var2  := JSon.Field['variavel_2'];
  Var3  := JSon.Field['variavel_3'];
  Var4  := JSon.Field['variavel_4'];
 
  FreeAndNil(Resposta);
  FreeAndNil(Consulta);

  JSArray := JSon.Field['variavel_5'] as TlkJSONlist;
  for i:=0 to JSArray.count-1 do
    ArrayObjetos.Add(VarToStr(JSArray.Child[i].Field['nome'].Value) +'='+ VarToStr(JSArray.Child[i].Field['valor'].Value));     // essa linha você ira alimentar o seu ClientDataSet
 end;



Segue a estrutura JSON para este exemplo:

{
  "variavel_1": 0,
  "variavel_2": false,
  "variavel_3": "Operação realizada com sucesso!",
  "variavel_4": "SAX",
  "variavel_5": [
    {
      "nome": "COMPRA",
      "valor": true
    },
    {
      "nome": "CONTABIL",
      "valor": true
    },
    {
      "nome": "CRM",
      "valor": true
    }
  ]
}



Como disse, as vezes não é 100% a solução que você precisa, mas acredito que possa ajudar a pensar.
Abração.. Att.
Responder

Mais Posts

Amigo, já fiz isso.
Eu passo o StringStream pra String e converto pra JsonArray ou JsonObject.
Não lembro bem o código de cabeça, mas é mais ou menos isso.

 json := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(strJson), 0) as TJSONArray;

ou
 json := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(strJson), 0) as TJSONObject;
Responder

29/01/2016

Hugo Silva

Pessoal muito obrigado, com as dicas de vocês consegui resolver meu problema.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira