Utilizamos cada vez mais o formato JSON. Por exemplo, para guardar definições num ficheiro, para armazenar configurações de software, ou para trocar dados de clientes na web com outros servidores.
Como se pode validar que os dados recebidos estão no formato esperado? Como se pode validar que toda a informação necessária está realmente presente? Como pode fazer esta validação sem escrever um método cansativo para cada tipo de formato JSON?
Basta escrever um esquema JSON e utilizar o parâmetro JSON Validate novo comando!
Preâmbulo
Como já deve saber, existe uma diferença entre um documento XML “Bem Formado” e um documento XML “Válido”. Um documento XML com a sintaxe correcta é chamado “Well Formed” e um documento XML validado contra uma DTD é tanto “Well Formed” como “Valid”.
Pode fazer o mesmo com os documentos JSON. Pode escrever um esquema JSON para descrever o seu documento JSON. Para conhecer a gramática e a sintaxe do esquema JSON, aconselho-o a visitar o site oficial: http://json-schema.org/
JSON Validar o comando
Com o JSON Parse já pode verificar se o documento do JSON está“Bem Formado“. Desde 4D v16 R4, o comando JSON Validate permite verificar se o documento JSON é“válido” de acordo com o seu esquema JSON.
O novo comando JSON Validate devolve um objecto. Neste objecto, o atributo “sucesso” é um booleano, o seu valor é verdadeiro quando o documento é válido e false quando o documento é inválido contra o esquema do JSON passado em parâmetro. O atributo “erros” é um conjunto de objectos com todas as informações para compreender e descobrir onde se encontra o erro.
Exemplo de código
Por exemplo, utilizamos o seguinte esquema varSchema JSON:
{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "Person", "type": "object", "properties": { "firstName": { "type": "string" }, "lastName": { "type": "string" }, "gender": { "description": "Gender is M or F", "enum": [ "M","F" ] }, "birthday": { "type": "object", "properties": { "day": {"type": "number"}, "month": {"type": "number"}, "year": {"type": "number"} }, "required": ["day", "month", "year"] } }, "required": ["firstName", "lastName"] }
Queremos verificar se o seguinte varJSON Documento do JSON é válido:
{ "firstName": "John", "lastName": "Doe", "gender": "U" }
Por conseguinte, executamos o seguinte código:
C_OBJECT($oJSON;$oSchema;$oResult)
$oJSON :=JSON Parse(varJSON;*) // New * optional parameter
$oSchema :=JSON Parse(varSchema)
$oResult:=JSON Validate($oJSON;$oSchema )
Nota: ao validar um ficheiro JSON, pretende recuperar facilmente a posição de erro no ficheiro original. Assim, adicionámos um parâmetro opcional ” * ” ao comando JSON Parse. Neste caso, 4D adiciona a informação sobre o número de linha e o valor do desvio para cada atributo.
Abaixo está o que é devolvido no objecto “$oResult” pelo JSON Validate comando:
{ "success": false, "errors": [ { "jsonPath": "gender", "line": 4, "offset": 4, "code": 22, "msg": "Error while validating against 'enum' key. \"U\" does not match any enum element in the schema.", "schemaPaths": "properties.gender.enum" } ] }
Nota: A implementação em v16 R4 suporta esta versão da validação do esquema JSON.