Valide o seu objecto JSON

Tradução automática de Deepl

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.

Exemplo de base de dados

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.

Vanessa Talbot
• Proprietário do produto - Vanessa Talbot entrou ao time 4D Program em Junho de 2014 como Proprietária do Produto e está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Desde sua chegada, trabalhou na definição de funcionalidades chaves em 4D. Trabalhou na maioria das novas funcionalidades multithread preemptivo e também em um tema muito complexo: a nova arquitetura para a aplicação engined. Vanessa é formada pela Telecom Saint-Etienne. Começou sua carreira no Instituto de Investigação Criminal como desenvolvedora do departamento audiovisual. Também trabalhou em meios de comunicação e no âmbito médico como especialista em assistência técnica, produção e documentação de novas funcionalidades.