Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Pegar valor de retorno (string) no formato json


robinhocne

Pergunta

Bom dia,
Eu tenho um retorno do JSON que está em uma variavel String e quero pegar o value dele....
Esse é o meu JSON 

{"error":{"code":400,"message":{"lang":"en-us","value":"Bad request: Error in parameter n_serie:Attribute \\"n_serie\\" not found in pedido_venda.inclui"}}}

quero só pegar a informação do value;

tentei fazer dessa maneira;

procedure TfrmPSyncBack.Button1Click(Sender: TObject);
var
jsonObj, jSubObj: TJSONObject;
já: TJSONArray;
jp, jSubPar: TJSONPair;
i, j: integer;
begin
jsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(Memo1.Text), 0) as TJSONObject;
//dada a seguinte string em notação JSON que será convertida pela função ParseJSONValue
//em um objeto nativo do delphi do tipo TJSONObject

Memo1.Lines.Clear;

jp := TJSONPair.Create;
jp := jsonObj.Get(0); //pega o par zero

já := TJSONArray.Create;
já := (jp.JsonValue as TJSONArray); // do par zero pega o valor, que é array
//quantidade de pares do objeto
Memo1.Lines.Add('quantidade de elementos ' + IntToStr(já.Size));
jSubObj:= TJSONObject.Create;
jSubPar := TJSONPair.Create;

for i := 0 to já.Size - 1 do //itera o array para pegar cada elemento
begin
jSubObj := (já.Get(i) as TJSONObject); //pega cada elemento do array, onde cada
//elemento é um objeto, neste caso, em função da string JSON montada acima
Memo1.Lines.Add('');
Memo1.Lines.Add('No elemento ' + IntToStr(i) +
' a quantidade de pares do objeto é = ' + IntToStr(jSubObj.Size) ); //quantidade de pares do objeto
for j := 0 to jSubObj.Size - 1 do //itera o objeto para pegar cada par
begin
jSubPar := jSubObj.Get(j); //pega o par no índice j
//do par pega separado a chave e o valor usando Value
Memo1.Lines.Add(jSubPar.JsonString.Value + ' : ' + jSubPar.JsonValue.Value);
end;
end;
end;

mas no já := (jp.JsonValue as TJSONArray); eu tenho esse erro

First chance exception at $73F4A9F2. Exception class EInvalidCast with message 'Invalid class typecast'.

 

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

não use caracteres especiais na variavel ( Já ) isso sempre é motivo para gerar erros

Classe de excepção EInvalidCast com mensagem 'Tipo de classe inválido'.

se voce pegou o codigo desse exemplo, verifique todo o código novamente

http://www.devmedia.com.br/trabalhando-com-tipos-json-no-delphi-2010-parte-3/17140

OBS: Verifique a string dentro do Memo

   jsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(
   '{"result":[{"Nome":"DELMAR","Cidade":"AJURICABA","Bairro":"CENTRO"},
{"Nome":"DALVAN","Cidade":"IJUÍ","Bairro":"JARDIM"}]}'
   ), 0) as TJSONObject;

veja se não estão faltando colchetes, chaves ou aspas duplas  ( { [ " )

abraço

 

Link para o comentário
Compartilhar em outros sites

  • 0

o Exemplo é esse mesmo, mas no memo eu tenho o meu json de retorno (mesmo que seja o erro).

Mas consegui resolver assim:

procedure Button1Click(Sender: TObject);
var
jsonObj, jSubObj: TJSONObject;
jv: TJSONValue;
begin
jsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(Memo1.Text), 0)
as TJSONObject;

Memo1.Lines.Clear;

jv := jsonobj.Get('error').JsonValue;
jsubObj := jv as TJSONObject;

jv := jsubObj.Get('message').JsonValue;
jsubObj := jv as TJSONObject;

jv := jsubObj.Get('value').JsonValue;

ShowMessage(jv.Value);

end;

 

Link para o comentário
Compartilhar em outros sites

  • 0

function getCamposJsonString(json,value:String): String;
var
   LJSONObject: TJSONObject;
   function TrataObjeto(jObj:TJSONObject):string;
   var i:integer;
       jPar: TJSONPair;
   begin
        result := '';
        for i := 0 to jObj.Size - 1 do
        begin
             jPar := jObj.Get(i);
             if jPar.JsonValue Is TJSONObject then
                result := TrataObjeto((jPar.JsonValue As TJSONObject)) else
             if sametext(trim(jPar.JsonString.Value),value) then
             begin
                  Result := jPar.JsonValue.Value;
                  break;
             end;
             if result <> '' then
                break;
        end;
   end;
begin
   try
      LJSONObject := nil;
      LJSONObject := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(json),0) as TJSONObject;
      result := TrataObjeto(LJSONObject);
   finally
      LJSONObject.Free;
   end;
end;

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...