Cada vez utilizamos más el formato JSON. Por ejemplo, para guardar los ajustes en un archivo, para almacenar la configuración del software, o para intercambiar datos del cliente en la web con otros servidores.
¿Cómo se puede validar que los datos recibidos están en el formato esperado? ¿Cómo se puede validar que toda la información necesaria está realmente presente? ¿Cómo puedes hacer esta validación sin escribir un método tedioso para cada tipo de formato JSON?
Simplemente escribiendo un esquema JSON y utilizando el JSON Validate ¡nuevo comando!
Preámbulo
Como ya sabrás, hay una diferencia entre un documento XML «bien formado» y un documento XML «válido». Un documento XML con una sintaxis correcta se denomina «Bien Formado» y un documento XML validado contra una DTD es tanto «Bien Formado» como «Válido».
Se puede hacer lo mismo con los documentos JSON. Puedes escribir un esquema JSON para describir tu documento JSON. Para conocer la gramática y la sintaxis del esquema JSON, te aconsejo que vayas al sitio oficial: http://json-schema.org/
Comando JSON Validate
Con el JSON Parse comando, ya puede comprobar que el documento JSON está«bien formado«. Desde 4D v16 R4, el comando JSON Validate le permite verificar que el documento JSON es «Válido» de acuerdo con su esquema JSON.
El nuevo JSON Validate devuelve un objeto. En este objeto, el atributo «success» es un booleano, su valor es verdadero cuando el documento es válido y false cuando el documento es inválido contra el esquema JSON pasado como parámetro. El atributo «errors» es un array de objetos con toda la información para entender y encontrar dónde está el error.
Ejemplo de código
Por ejemplo, utilizamos el siguiente esquema 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"] }
Queremos comprobar si el siguiente documento JSON de varJSON es válido:
{ "firstName": "John", "lastName": "Doe", "gender": "U" }
Así que ejecutamos el siguiente código:
C_OBJECT($oJSON;$oSchema;$oResult)
$oJSON :=JSON Parse(varJSON;*) // New * optional parameter
$oSchema :=JSON Parse(varSchema)
$oResult:=JSON Validate($oJSON;$oSchema )
Nota: cuando se valida un archivo JSON, se quiere recuperar fácilmente la posición del error en el archivo original. Por ello, hemos añadido un parámetro opcional » * » al comando JSON Parse. En este caso, 4D añade la información sobre el número de línea y el valor del offset para cada atributo.
A continuación se muestra lo que se devuelve en el objeto «$oResult» por el 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: La implementación en la v16 R4 soporta esta versión de validación del esquema JSON.