#------------------------------------------------------------------------------#
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 |