Páginas filhas
  • LGX - LJSONOBJECT

Permite ler e manipular informações no tipo de dados JSON.

Componente disponível a partir da versão 12.1.18 do Logix.


Hierarquia



Sintaxe


_ADVPL_create_component(NULL,"LJSONOBJECT") => cComponentReference


Métodos GET


Métodos acessíveis utilizando a função _ADVPL_get_property, que permite recuperar e manipular os valores do componente: 


Método GET: ACTIVATE 

Ativa o conteúdo JSON para leitura e manipulação.

Sintaxe



LET l_status = _ADVPL_get_property(< l_reference >,"ACTIVATE", < l_json >)

Parâmetros



Nome

Tipo

Descrição

Obrigatório?

Padrão

l_jsonCHARConteúdo JSON que será utilizado.Sim

Retorno



TipoDescrição
SMALLINTVerdadeiro se o JSON foi ativado com sucesso.

Exemplo



LET l_status = _ADVPL_get_property(l_json_reference,"ACTIVATE","{""code"":1}")

IF  NOT l_status THEN
    CALL log0030_processa_mensagem("Não foi possível ativar o JSON informado, verifique se o mesmo é válido.","stop",0)
    RETURN FALSE
END IF




Método GET: LENGTH

Retorna a quantidade de itens dentro de uma lista JSON.

Sintaxe



LET l_length = _ADVPL_get_property(< l_reference >,"LENGTH", < l_path >)

Parâmetros



Nome

Tipo

Descrição

Obrigatório?

Padrão

l_pathCHARCaminho completo do atributo do tipo lista no JSON.Sim

Retorno



TipoDescrição
INTEGERQuantidade de itens existentes dentro da lista JSON informada.

Exemplo



# Recupera a quantidade de "phoneNumber" disponíveis no JSON.
LET l_phones = _ADVPL_get_property(l_json_reference,"LENGTH","phoneNumber")




Método GET: PROPERTIES

Retorna a lista de propriedades disponíveis em determinado atributo do JSON.

Sintaxe



LET la_properties = _ADVPL_get_property(< l_reference >,"PROPERTIES", < l_path >, [ l_complete ])

Parâmetros



l_pathCHARCaminho completo do atributo no JSON.Sim
l_completeSMALLINTVerdadeiro se deverá trazer o nome da propriedade completa.NãoTRUE

Nome

Tipo

Descrição

Obrigatório?

Padrão

Retorno



TipoDescrição
ARRAY OF CHARLista com as propriedades do atributo JSON informado.

Exemplo



DEFINE l_ind SMALLINT
DEFINE la_properties ARRAY[50] OF CHAR(100)

# Recupera a lista de propriedades existentes no atributo "address".
LET la_properties = _ADVPL_get_property(l_json_reference,"OBJECT_PROPERTIES","address")

FOR l_ind = 1 TO 50
    IF  la_properties[l_ind] IS NULL THEN
        EXIT FOR
    END IF

    CALL CONOUT("PROPERTY: " || la_properties[l_ind] CLIPPED)
END FOR




Método GET: TYPE

Retorna o tipo de um atributo JSON.

Sintaxe



LET l_type = _ADVPL_get_property(< l_reference >,"TYPE", < l_path >)

Parâmetros



Nome

Tipo

Descrição

Obrigatório?

Padrão

l_pathCHARCaminho completo do atributo no JSON.Sim

Retorno



TipoDescrição
CHARTipo do atributo JSON, sendo: C - CHAR, N - NUMERIC, O - OBJECT e A - ARRAY.

Exemplo



DEFINE l_type      CHAR(001)

# Recupera o tipo de alguns atributos JSON.
LET l_type = _ADVPL_get_property(l_json_reference,"TYPE","lastName")    # C - CHAR
LET l_type = _ADVPL_get_property(l_json_reference,"TYPE","age")         # N - NUMERIC
LET l_type = _ADVPL_get_property(l_json_reference,"TYPE","address")     # O - OBJECT
LET l_type = _ADVPL_get_property(l_json_reference,"TYPE","phoneNumber") # A - ARRAY




Método GET: VALUE

Retorna o valor de determinado atributo do JSON.

Sintaxe



LET l_value = _ADVPL_get_property(< l_reference >,"VALUE", < l_path >)

Parâmetros



Nome

Tipo

Descrição

Obrigatório?

Padrão

l_pathCHARCaminho completo do atributo no JSON.Sim

Retorno



TipoDescrição
MIXEDValor do atributo informado, o tipo de dado depende do tipo do atributo JSON.

Exemplo



DEFINE l_streetAddress CHAR(050)
DEFINE l_phoneNumber   CHAR(012)

# Recupera o valor do atributo "streeAddress" dentro do objeto "address".
LET l_streetAddress = _ADVPL_get_property(l_json_reference,"VALUE","address/streetAddress")
 
# Recupera o primeiro "phoneNumber" do JSON.
LET l_phoneNumber = _ADVPL_get_property(l_json_reference,"VALUE","phoneNumber[1]/number")

Exemplo (array de record)



DEFINE l_json_data          CHAR(30000)
DEFINE l_json_reference     VARCHAR(10)    
DEFINE l_length_ajusts      SMALLINT
DEFINE l_status             SMALLINT
DEFINE l_ind                SMALLINT 
   
DEFINE ma_ajust_bxa_adt_integ  ARRAY[500] OF RECORD
	                                             cod_tip_val      LIKE ad_valores.cod_tip_val,
	                                             valor            LIKE ad_valores.valor,
	                                             num_ad_nf_orig   LIKE adiant.num_ad_nf_orig,
	                                             ser_nf           LIKE adiant.ser_nf,
	                                             ssr_nf           LIKE adiant.ssr_nf,
	                                             cod_fornecedor   LIKE adiant.cod_fornecedor,
	                                             dat_mov          LIKE mov_adiant.dat_mov      
	                                         END RECORD                  
                                                                
LET l_json_data = 
'{
  "payload": {
      "ajustBxaAdtInteg": [
	      {
	         "codTipVal": "1",
	         "valor": 1000,
	         "numAdNfOrig": 123456,
	         "serNf": "AD",
	         "ssrNF": "A",
	         "codFornecedor": "12",
	         "datMov": "10/10/2019"
	   	  },
	   	  {
	   		 "codTipVal": "2",
	   		 "valor": 3000,
	   		 "numAdNfOrig": 654321,
	   		 "serNf": "AF",
	   		 "ssrNF": "B",
	   		 "codFornecedor": "13",
	   	     "datMov": "01/12/2018"
	   	  },
	      {
	   		 "codTipVal": "3",
	   		 "valor": 2000,
	   		 "numAdNfOrig": 555555,
	   		 "serNf": "AJ",
	   		 "ssrNF": "C",
	   		 "codFornecedor": "14",
	   		 "datMov": "31/10/2019"
	   	  }
   	  ]
   }
}'
   
LET l_json_reference = _ADVPL_create_component(NULL, "LJSONOBJECT")
LET l_status         = _ADVPL_get_property(l_json_reference,"ACTIVATE",l_json_data CLIPPED)
   
LET l_length_ajusts = _ADVPL_get_property(l_json_reference, "LENGTH", "payload/ajustBxaAdtInteg")    
    
FOR l_ind = 1 TO l_length_ajusts
       
   LET ma_ajust_bxa_adt_integ[l_ind].cod_tip_val    = _ADVPL_get_property(l_json_reference, "VALUE", "payload/ajustBxaAdtInteg["||l_ind||"]/codTipVal")
   LET ma_ajust_bxa_adt_integ[l_ind].valor          = _ADVPL_get_property(l_json_reference, "VALUE", "payload/ajustBxaAdtInteg["||l_ind||"]/valor")
   LET ma_ajust_bxa_adt_integ[l_ind].num_ad_nf_orig = _ADVPL_get_property(l_json_reference, "VALUE", "payload/ajustBxaAdtInteg["||l_ind||"]/numAdNfOrig")
   LET ma_ajust_bxa_adt_integ[l_ind].ser_nf         = _ADVPL_get_property(l_json_reference, "VALUE", "payload/ajustBxaAdtInteg["||l_ind||"]/serNf")
   LET ma_ajust_bxa_adt_integ[l_ind].ssr_nf         = _ADVPL_get_property(l_json_reference, "VALUE", "payload/ajustBxaAdtInteg["||l_ind||"]/ssrNF")
   LET ma_ajust_bxa_adt_integ[l_ind].cod_fornecedor = _ADVPL_get_property(l_json_reference, "VALUE", "payload/ajustBxaAdtInteg["||l_ind||"]/codFornecedor")
   LET ma_ajust_bxa_adt_integ[l_ind].dat_mov        = _ADVPL_get_property(l_json_reference, "VALUE", "payload/ajustBxaAdtInteg["||l_ind||"]/datMov")
       
   CALL CONOUT("------------------- Exibindo os valores --------------------")
   CALL CONOUT(ma_ajust_bxa_adt_integ[l_ind].cod_tip_val)
   CALL CONOUT(ma_ajust_bxa_adt_integ[l_ind].valor)
   CALL CONOUT(ma_ajust_bxa_adt_integ[l_ind].num_ad_nf_orig)
   CALL CONOUT(ma_ajust_bxa_adt_integ[l_ind].ser_nf)
   CALL CONOUT(ma_ajust_bxa_adt_integ[l_ind].ssr_nf)
   CALL CONOUT(ma_ajust_bxa_adt_integ[l_ind].cod_fornecedor)
   CALL CONOUT(ma_ajust_bxa_adt_integ[l_ind].dat_mov)
   
END FOR







Métodos SET


Métodos acessíveis utilizando a função _ADVPL_set_property que permite alterar e manipular os valores do componente.

Método SET: DEACTIVATE

Desativa o conteúdo JSON utilizado liberando recursos na memória do servidor.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"DEACTIVATE")

Exemplo



# Ao finalizar o uso, desativa o componente.
CALL _ADVPL_set_property(l_json_reference,"DEACTIVATE")




Método SET: VALUE

Define o valor de determinado atributo do JSON.

Sintaxe



CALL _ADVPL_set_property(< l_reference >,"VALUE", < l_value >, < l_path >)

Parâmetros



Nome

Tipo

Descrição

Obrigatório?

Padrão

l_valueMIXEDValor que será definido para o atributo, o tipo de dado vai depender do tipo da variável.Sim
l_pathCHARCaminho completo do atributo no JSON.Sim


Exemplo



# Altera o atributo "age".
CALL _ADVPL_set_property(l_json_reference,"VALUE",30,"age")




Exemplo



Clique no link na lateral direita para expandir o código de exemplo.

Código de exemplo do componente LJsonObject
#------------------------------------------------------------------------------#
FUNCTION LJSONObjectExemplo()
#------------------------------------------------------------------------------#
    DEFINE l_json_reference VARCHAR(10)
 
    DEFINE l_status    SMALLINT
    DEFINE l_json_data CHAR(500)
 
    DEFINE l_ind       SMALLINT
    DEFINE l_phones    SMALLINT
 
    DEFINE lr_person   RECORD
                           firstName   CHAR(50),
                           lastName    CHAR(50),
                           age         SMALLINT,
                           adress      RECORD
                                           streetAddress CHAR(50),
                                           city          CHAR(50),
                                           state         CHAR(50),
                                           postalCode    INTEGER
                                       END RECORD,
                           phoneNumber ARRAY[] OF RECORD
                                           category      CHAR(10),
                                           number        CHAR(12)
                                       END RECORD
                       END RECORD
 
    INITIALIZE lr_person.* TO NULL
 
    LET l_json_data = l_json_data CLIPPED, '{'
    LET l_json_data = l_json_data CLIPPED,     '"firstName": "John",'
    LET l_json_data = l_json_data CLIPPED,     '"lastName": "Smith",'
    LET l_json_data = l_json_data CLIPPED,     '"age": 25,'
    LET l_json_data = l_json_data CLIPPED,     '"address": {'
    LET l_json_data = l_json_data CLIPPED,         '"streetAddress": "21 2nd Street",'
    LET l_json_data = l_json_data CLIPPED,         '"city": "New York",'
    LET l_json_data = l_json_data CLIPPED,         '"state": "NY",'
    LET l_json_data = l_json_data CLIPPED,         '"postalCode": "10021"'
    LET l_json_data = l_json_data CLIPPED,     '},'
    LET l_json_data = l_json_data CLIPPED,     '"phoneNumber": [{'
    LET l_json_data = l_json_data CLIPPED,             '"category": "home",'
    LET l_json_data = l_json_data CLIPPED,             '"number": "212 555-1234"'
    LET l_json_data = l_json_data CLIPPED,         '}, {'
    LET l_json_data = l_json_data CLIPPED,             '"category": "fax",'
    LET l_json_data = l_json_data CLIPPED,             '"number": "646 555-4567"'
    LET l_json_data = l_json_data CLIPPED,     '}]'
    LET l_json_data = l_json_data CLIPPED,  '}'
 
    LET l_json_reference = _ADVPL_create_component(NULL,"LJSONOBJECT")
    LET l_status = _ADVPL_get_property(l_json_reference,"ACTIVATE",l_json_data CLIPPED)
 
    IF  NOT l_status THEN
        CALL log0030_processa_mensagem("Não foi possível ativar o JSON informado, verifique se o mesmo é válido.","stop",0)
        RETURN FALSE
    END IF
 
    # Recupera os valores dos atributos do objeto principal.
    LET lr_person.firstName = _ADVPL_get_property(l_json_reference,"VALUE","firstName")
    LET lr_person.lastName  = _ADVPL_get_property(l_json_reference,"VALUE","lastName")
    LET lr_person.age       = _ADVPL_get_property(l_json_reference,"VALUE","age")
 
    # Recupera os valores dos atributos do objeto "address".
    LET lr_person.adress.streetAddress = _ADVPL_get_property(l_json_reference,"VALUE","address/streetAddress")
    LET lr_person.adress.city          = _ADVPL_get_property(l_json_reference,"VALUE","address/city")
    LET lr_person.adress.state         = _ADVPL_get_property(l_json_reference,"VALUE","address/state")
    LET lr_person.adress.postalCode    = _ADVPL_get_property(l_json_reference,"VALUE","address/postalCode")
 
    # Recupera a quantidade de "phoneNumber".
    LET l_phones = _ADVPL_get_property(l_json_reference,"LENGTH","phoneNumber")
 
    FOR l_ind = 1 TO l_phones
        # Adiciona um novo "phoneNumber" no ARRAY.
        CALL ArrayAddItem(lr_person.phoneNumber,1)
 
        # Recupera os valores dos atributos do objeto "phoneNumber" para a linha atual.
        LET lr_person.phoneNumber[l_ind].category = _ADVPL_get_property(l_json_reference,"VALUE","phoneNumber["|| l_ind USING "<<<<<"||"]/category")
        LET lr_person.phoneNumber[l_ind].number   = _ADVPL_get_property(l_json_reference,"VALUE","phoneNumber["|| l_ind USING "<<<<<"||"]/number")
    END FOR
 
    # Emite no CONSOLE os dados recuperados.
    CALL CONOUT("FIRST NAME....: " || lr_person.firstName CLIPPED)
    CALL CONOUT("LAST NAME.....: " || lr_person.lastName CLIPPED)
    CALL CONOUT("AGE...........: " || lr_person.age USING "<<<<<")
    CALL CONOUT("ADRESS---------")
    CALL CONOUT("STREET ADDRESS: " || lr_person.adress.streetAddress CLIPPED)
    CALL CONOUT("CITY..........: " || lr_person.adress.city CLIPPED)
    CALL CONOUT("STATE.........: " || lr_person.adress.state CLIPPED)
    CALL CONOUT("POSTAL CODE...: " || lr_person.adress.postalCode USING "<<<<<<<<<&")
 
    # Recupera a quantidade de "phoneNumber" a partir do ARRAY.
    LET l_phones = ArrayLength(lr_person.phoneNumber)
 
    FOR l_ind = 1 TO l_phones
       #CALL CONOUT("PHONE 01-----------")
        CALL CONOUT("PHONE "|| l_ind USING "<<<&&" ||"-------")
        CALL CONOUT("CATEGORY......: " || lr_person.phoneNumber[l_ind].category CLIPPED)
        CALL CONOUT("NUMBER........: " || lr_person.phoneNumber[l_ind].number CLIPPED)
    END FOR
 
    # Altera a idade e a cidade do "John Smith".
    LET lr_person.age = 30
    LET lr_person.adress.city = "Los Angeles"
    CALL _ADVPL_set_property(l_json_reference,"VALUE",lr_person.age,"age")
    CALL _ADVPL_set_property(l_json_reference,"VALUE",lr_person.adress.city CLIPPED,"address/city")
 
    # Serializa o JSON alterado e emite o novo conteúdo no CONSOLE.
    LET l_json_data = _ADVPL_get_property(l_json_reference,"SERIALIZE")
    CALL CONOUT(l_json_data)
 
    # Ao finalizar o uso, desativa o componente.
    CALL _ADVPL_set_property(l_json_reference,"DEACTIVATE")
 
    RETURN TRUE
END FUNCTION