Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

  • 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

Bloco de código
themeEclipse
languagecpp
titleExemplo 1
linenumberstrue
collapsefalse
#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

...