Árvore de páginas

Faz o parser Json de uma mensagem e retorna um objeto da classe THashMap para agilizar as buscas, pois o objeto retornado é um HashMap.

Sintaxe

Json_Hash( < cJson >, < nLen >, < @aJson >, < @nRet >, < @oJHM > )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

cJson

Caractere

Mensagem no formato Json

X

 

nLen

Numérico

Tamanho da mensagem Json que será avaliado

X

 

aJsonVetorVetor contendo todos os campos "parseados" da mensagem JsonXX
nRetNuméricoIndica o número de caracteres lidos da mensagem JsonXX
oJHM
THashMapObjeto da classe THashMap que contem os campos e os valores da mensagem JsonXX

Retorno

Nome

Tipo

Descrição

lRet

Lógico

Retorno do Parser.

Observações

  • Irá executar o parser na mensagem (cJson) até encontrar uma string Json válida ou um erro no formato, se o retorno (lRet) for.T.nRet irá indicar qual o tamanho da mensagem Json lida até encontrar uma mensagem válida, isto permite ter strings Json concatenadas e analisar cada parte, todavia se o retorno for .F.nRet irá indicar quantos caracteres válidos foram lidos, sendo o próximo caractere inválido.
  • No Vetor (aJson) contendo os valores JSon, todo Objeto Json será indicado pelo nome "#_OBJECT_#" para que seja possível diferenciá-lo de um Lista/Vetor Json.
  • Se não for usar aJson , limpe o seu conteúdo logo após a chamada da função para liberar memória.

Exemplos

Exemplo 1
#include 'protheus.ch'
 
User Function JSonHash()
  Local oJson := Nil
  Local strJson1 := '{"inteiro":100,"double":10.32,"OK":true,"NOK":false,"NULO":null,"VAZIO":"","ROWS":[{"Valor":5000,"OBJ":{"x":2},"Data":"2014-08-29"}, "ricardo"], "VETOR":[1,2,3,4]}'
  Local strJson := Nil
  Local lenStrJson := 0
  Local aJsonfields := {}
  Local nRetParser := 0
  Local lRet := .F.
  Local oJHM := .F.
  Local xGet := Nil
  Local cGet := Nil
  // Cria o objeto para fazer o parser do Json
  oJson := tJsonParser():New()
// -------------------------------------------------------------------
  strJson = strJson1
  lenStrJson := Len(strJson)
  // Faz o Parser da mensagem JSon e extrai para Array (aJsonfields) e cria tambem um HashMap para os dados da mensagem (oJHM)
  aJsonfields := {}
  lRet = oJson:Json_Hash(strJson, lenStrJson, @aJsonfields, @nRetParser, @oJHM)
  If ( lRet == .F. )
    ConOut("##### [JSON][ERR] " + "Parser com erro" + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    ConOut("Erro a partir: " + SubStr(strJson, (nRetParser+1)))
  Else
    ConOut("[JSON] "+ "+++++ PARSER OK num campos: " + AllTrim(Str(Len(aJsonfields))) + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    //VarInfo("b->", aJsonfields)
    
    // Se nao for utilizar aJsonfields, libere o vetor
    aJsonfields := {}
    
    // Obtem o valor dos campos usando a chave
    cGet := "inteiro"
    lRet := HMGet(oJHM, cGet, xGet)
    If (lRet)
      VarInfo("c->", xGet)
    Else
      ConOut("ERRO ao obter: " + cGet)
    EndIf
    
    cGet := "ROWS[1]"
    lRet := HMGet(oJHM, cGet, xGet)
    If (lRet)
      VarInfo("d->", xGet)
    Else
      ConOut("ERRO ao obter: " + cGet)
    EndIf
    
    cGet := "ROWS[0].OBJ.x"
    lRet := HMGet(oJHM, cGet, xGet)
    If (lRet)
      VarInfo("e->", xGet)
    Else
      ConOut("ERRO ao obter: " + cGet)
    EndIf
    
    cGet := "VETOR[2]"
    lRet := oJHM:Get(cGet, xGet)
    If (lRet)
      VarInfo("f->", xGet)
    Else
      ConOut("ERRO ao obter: " + cGet)
    EndIf
    
    // Lista todas as Chaves do Json
    lRet := HMList(oJHM, xGet)
    If (lRet)
      ConOut("LISTA JSON HASHMAP:")
      VarInfo("LISTA", xGet)
    Else
      ConOut("ERRO ao obter: JSON HASHMAP")
    EndIf
  EndIf
  
Return
/*
CHAVES = VALORES
inteiro=100
double=10.32
OK=.T.
NOK=.F.
NULO=
VAZIO=""
ROWS[0].Valor=5000
ROWS[0].OBJ.x=2
ROWS[0].Data=2014-08-29
ROWS[1]=ricardo
VETOR[0]=1
VETOR[1]=2
VETOR[2]=3
VETOR[3]=4
*/

Abrangência

Totvs Application Server com versão igual ou superior a 7.00.131227A

Veja também

  • Sem rótulos