Convalidare l’oggetto JSON

Tradotto automaticamente da Deepl

Utilizziamo sempre più spesso il formato JSON. Ad esempio, per salvare le impostazioni in un file, per memorizzare la configurazione del software o per scambiare dati client sul web con altri server.

Come si può verificare che i dati ricevuti siano nel formato previsto? Come si può verificare che tutte le informazioni necessarie siano effettivamente presenti? Come si può fare questa convalida senza scrivere un metodo noioso per ogni tipo di formato JSON?

È sufficiente scrivere uno schema JSON e utilizzare il comando JSON Validate nuovo comando!

Premessa
Come forse già sapete, esiste una differenza tra un documento XML “ben formato” e un documento XML “valido”. Un documento XML con una sintassi corretta è chiamato “ben formato” e un documento XML convalidato rispetto a una DTD è sia “ben formato” che “valido”.
È possibile fare lo stesso con i documenti JSON. È possibile scrivere uno schema JSON per descrivere il documento JSON. Per conoscere la grammatica e la sintassi dello schema JSON, vi consiglio di visitare il sito ufficiale: http://json-schema.org/.

Comando JSON Validate

Con il comando JSON Parse è già possibile verificare che il documento JSON sia“ben formato“. Da 4D v16 R4, il comando JSON Validate consente di verificare che il documento JSON sia“Valido” in base allo schema JSON.

Esempio di database

Il nuovo JSON Validate restituisce un oggetto. In questo oggetto, l’attributo “success” è un booleano, il cui valore è vero quando il documento è valido e false quando il documento non è valido rispetto allo schema JSON passato come parametro. L’attributo “errors” è un array di oggetti con tutte le informazioni per capire e trovare dove si trova l’errore.

Esempio di codice

Ad esempio, utilizziamo il seguente schema JSON varSchema:

{
     "$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"]
 }

Vogliamo verificare se il seguente documento varJSON JSON è valido:

{
    "firstName": "John",
    "lastName": "Doe",
    "gender": "U" 
}

Eseguiamo quindi il seguente codice:

C_OBJECT($oJSON;$oSchema;$oResult)
$oJSON :=JSON Parse(varJSON;*) // New * optional parameter
$oSchema
:=JSON Parse(varSchema)
$oResult
:=JSON Validate($oJSON;
$oSchema )

Nota: quando si convalida un file JSON, si vuole recuperare facilmente la posizione dell’errore nel file originale. Per questo motivo, abbiamo aggiunto un parametro opzionale ” * ” al comando JSON Parse. In questo caso, 4D aggiunge le informazioni sul numero di riga e il valore di offset per ogni attributo.

Di seguito è riportato ciò che viene restituito nell’oggetto “$oResult” dal comando JSON Validate dal 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: l’implementazione nella v16 R4 supporta questa versione della convalida dello schema JSON.

Vanessa Talbot
- Product Owner - Vanessa Talbot è entrata a far parte del team di 4D Program nel giugno 2014. In qualità di Product Owner, è incaricata di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo ruolo è anche quello di assicurarsi che l'implementazione della funzionalità fornita soddisfi le esigenze del cliente. Ha lavorato sulla maggior parte delle nuove funzionalità di multi-threading preemptive e anche su un argomento molto complesso: la nuova architettura per le applicazioni con motore. Vanessa si è laureata presso Telecom Saint-Etienne. Ha iniziato la sua carriera presso il Criminal Research Institute come sviluppatrice per il dipartimento audiovisivo. Ha lavorato anche nei settori dei media e della medicina come esperta di supporto tecnico, produzione e documentazione di nuove funzionalità.