Árvore de páginas

Faz o parser Json de uma mensagem.

Sintaxe

Json_Parser( < cJson >, < nLen >, < @aJson >, < @nRet > )

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

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.

Exemplos

Exemplo 1
#include 'protheus.ch'

Static Function printJson(aJson, niv)
  VarInfo(niv, aJson)
Return .T.

User Function teste_json()
  
  Local oJson := nil
  // Objeto Json
  Local strJson1 := '{"inteiro":100,"double":10.32,"OK":true,"NOK":false,"NULO":null,"VAZIO":"","ROWS":[{"Estado":"BR-SP","Valor":530,"Data":"2012-09-19"},{"Estado":"BR-PR","Valor":5000,"Data":"2012-09-29"},[10,20,30,40], "ricardo"],"VETOR":[1,2,3,4]}'
  // Vetor Json
  Local strJson2 := '[1, 2,null, 3, 4, 5]'
  // Strings Json contatenadas (pega somente o primeiro)
  Local strJson3 := '{"Contador":1},null,{"Contador":"100"}'
  // Dados primarios (pega somente o primeiro)
  Local strJson4 := '"somente string", "str2", "str3"'
  // Dados primarios (pega somente o primeiro)
  Local strJson5 := '1, 2, 3, 4, 5'
  // Dados primarios (pega somente o primeiro)
  Local strJson6 := 'null, true, false'
  // Teste de erro, correto ate o caractere 23 caractere (no 24 falta o caractere de aspas dupla (") )
  Local strJson7 := '{"val":1,"teste":false,x:=2}'
  Local strJson := Nil
  Local lenStrJson := 0
  Local jsonfields := Nil
  Local nRetParser := 0
  Local lRet := .F.
  
  oJson := tJsonParser():New()
  
  strJson := strJson1
  lenStrJson := Len(strJson)
  jsonfields := {}
  lRet := oJson:Json_Parser(strJson, lenStrJson, @jsonfields, @nRetParser)
  
  If ( lRet == .F. )
    ConOut("##### [JSON][ERR] " + "Parser 1 com erro" + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    ConOut("Erro a partir: " + SubStr(strJson, (nRetParser+1)))
  Else
    ConOut("[JSON] "+ "+++++ PARSER 1 OK num campos: " + AllTrim(Str(Len(jsonfields))) + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    printJson(jsonfields, "| ")
  EndIf
  ConOut("-------------------------------------------------------", "")
  
  strJson := strJson2
  lenStrJson := Len(strJson)
  jsonfields := {}
  lRet := oJson:Json_Parser(strJson, lenStrJson, @jsonfields, @nRetParser)
  If ( lRet == .F. )
    ConOut("##### [JSON][ERR] " + "Parser 2 com erro" + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    ConOut("Erro a partir: " + SubStr(strJson, (nRetParser+1)))
  Else
    ConOut("[JSON] "+ "+++++ PARSER 2 OK num campos: " + AllTrim(Str(Len(jsonfields))) + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    printJson(jsonfields, "| ")
  EndIf
  ConOut("-------------------------------------------------------", "")
  
  strJson := strJson3
  lenStrJson := Len(strJson)
  jsonfields := {}
  lRet := oJson:Json_Parser(strJson, lenStrJson, @jsonfields, @nRetParser)
  If ( lRet == .F. )
    ConOut("##### [JSON][ERR] " + "Parser 3 com erro" + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    ConOut("Erro a partir: " + SubStr(strJson, (nRetParser+1)))
  Else
    ConOut("[JSON] "+ "+++++ PARSER 3 OK num campos: " + AllTrim(Str(Len(jsonfields))) + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    printJson(jsonfields, "| ")
  EndIf
  ConOut("-------------------------------------------------------", "")
  
  strJson := strJson4
  lenStrJson := Len(strJson)
  jsonfields := {}
  lRet := oJson:Json_Parser(strJson, lenStrJson, @jsonfields, @nRetParser)
  If ( lRet == .F. )
    ConOut("##### [JSON][ERR] " + "Parser 4 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 4 num campos: " + AllTrim(Str(Len(jsonfields))) + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    printJson(jsonfields, "| ")
  EndIf
  ConOut("-------------------------------------------------------", "")
  
  strJson := strJson5
  lenStrJson := Len(strJson)
  jsonfields := {}
  lRet := oJson:Json_Parser(strJson, lenStrJson, @jsonfields, @nRetParser)
  If ( lRet == .F. )
    ConOut("##### [JSON][ERR] " + "Parser 5 com erro" + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    ConOut("Erro a partir: " + SubStr(strJson, (nRetParser+1)))
  Else
    ConOut("[JSON] "+ "+++++ PARSER 5 OK num campos: " + AllTrim(Str(Len(jsonfields))) + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    printJson(jsonfields, "| ")
  EndIf
  ConOut("-------------------------------------------------------", "")
  
  strJson := strJson6
  lenStrJson := Len(strJson)
  jsonfields := {}
  lRet := oJson:Json_Parser(strJson, lenStrJson, @jsonfields, @nRetParser)
  If ( lRet == .F. )
    ConOut("##### [JSON][ERR] " + "Parser 6 com erro" + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    ConOut("Erro a partir: " + SubStr(strJson, (nRetParser+1)))
  Else
    ConOut("[JSON] "+ "+++++ PARSER 6 OK num campos: " + AllTrim(Str(Len(jsonfields))) + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    printJson(jsonfields, "| ")
  EndIf
  ConOut("-------------------------------------------------------", "")
  strJson := strJson7
  lenStrJson := Len(strJson)
  jsonfields := {}
  lRet := oJson:Json_Parser(strJson, lenStrJson, @jsonfields, @nRetParser)
  If ( lRet == .F. )
    ConOut("##### [JSON][ERR] " + "Parser 7 com erro" + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    ConOut("Erro a partir: " + SubStr(strJson, (nRetParser+1)))
  Else
    ConOut("[JSON] "+ "+++++ PARSER 7 OK num campos: " + AllTrim(Str(Len(jsonfields))) + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
    printJson(jsonfields, "| ")
  EndIf
  ConOut("-------------------------------------------------------", "")
Return

Abrangência

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

  • Sem rótulos