Ejemplo: convertir JSON en CSV
En este ejemplo encontrará una asignación de datos que convierte datos de un archivo de instancia JSON en un archivo de texto separado por comas. En este apartado explicamos también cómo se pueden asignar valores de propiedades adicionales, que pueden estar en el archivo de instancia JSON, pero no están definidas en el esquema. Por norma general recomendamos que no haga uso de las propiedades adicionales, sino que defina todas las propiedades en su esquema JSON. Sin embargo, si la instancia JSON contiene propiedades adicionales puede usar la técnica que se explica en este ejemplo.
Este ejemplo incluye una asignación de ejemplo que encontrará en: <Documentos>\Altova\MapForce2023\MapForceExamples\Tutorial\ReadJSON.mfd. Si sigue los pasos que se describen a continuación aprenderá a preparar una asignación de este tipo desde cero.
El archivo JSON de origen contiene registros sobre gente; debemos pasar esos registros a formato CSV. Observe el texto resaltado: la primera y la segunda persona tienen una propiedad adicional que no está definida en el esquema: birthday.
[ { "name": "Alethia Alonso", "email": "altethia@example.com", "age": 35, "birthday": "4 July" }, { "name": "Klaus Mauer", "email": "klaus@example.com", "age": 57, "birthday": "31 August" }, { "name": "Natsuo Shinohara", "email": "natsuo@example.com", "age": 29 } ] |
People.json
A continuación puede ver el esquema JSON que se utilizó para este ejemplo. Como indica la palabra clave \$schema, el esquema valida instancias JSON con el borrador de especificación 04 JSON Schema. Describe una matriz llamada people compuesta por varios objetos person. El objeto people debe contener como mínimo un objeto person para poder ser válido. Cada objeto person tiene las propiedades name, age y email. Recuerde que name y email son de tipo string, mientras que age es de tipo integer. Además, las propiedades name y email son obligatorias, mientras que age es opcional.
{ "\$schema": "http://json-schema.org/draft-04/schema#", "title": "people", "type": "array", "items": { "title": "person", "type": "object", "required": [ "name", "email" ], "properties": { "name": { "type": "string" }, "email": { "type": "string", "format": "email" }, "age": { "type": "integer" } } }, "minItems": 1 } |
People.schema.json
Es importante observar que el esquema JSON de la imagen anterior no tiene una propiedad additionalProperties para el objeto person. Cuando no está presente en el esquema JSON, la propiedad additionalProperties tiene el valor predeterminado true, lo cual significa que en la instancia JSON este objeto puede tener tantas propiedades adicionales como sean necesarias y la instancia JSON seguirá siendo válida. Por lo tanto, un archivo de instancia como People.json se ajustará perfectamente a este esquema.
Para conseguir el objetivo de este ejemplo, siga las instrucciones que describimos a continuación.
Paso 1: añadir el archivo JSON de origen a la asignación
1.En el menú Insertar, haga clic en Archivo o esquema JSON y navegue hasta el siguiente archivo: <Documentos>\Altova\MapForce2023\MapForceExamples\Tutorial\People.schema.json. Cuando la aplicación le pida que indique una instancia, seleccione el archivo People.json en la misma carpeta. En este punto el compponente de MapForce tiene este aspecto:
La estructura del componente de MapForce recuerda a la del archivo JSON propiamente dicho, con la excepción del nodo propiedad (adicional). Este nodo indica que la propiedad additionalProperties del objeto person no está presente o que tiene el valor true en el esquema. Esto significa que el esquema puede contener propiedades adicionales personalizadas. Por eso MapForce presenta este nodo, en caso de que desee asignar datos de propiedades adicionales del objeto (ver pasos siguientes).
Si quiere cambiar el archivo JSON de origen o el archivo de esquema JSON en un momento dado, haga doble clic en la barra del título del componente JSON para acceder a las opciones (véase Configuración de componentes JSON).
Paso 2: añadir el archivo CSV de destino a la asignación
1.Haga clic en el comando de menú Insertar | Archivo de texto.
2.Seleccione la opción Utilizar procesamiento básico para archivos CSV y después haga clic en el botón Continuar.
3.Haga clic en Anexar campo varias veces hasta añadir cuatro campos CSV (imagen anterior) y después haga clic en Aceptar.
Para más información sobre componentes de texto consulte Archivos CSV y archivos de texto.
Paso 3: dibujar las conexiones de la asignación
1.Dibuje en la asignación las conexiones entre el componente JSON y el componente CSV como se muestra a continuación.
Para más información consulte Trabajar con conexiones.
Paso 4: previsualizar la asignación
Ahora puede consultar una vista previa del resultado de la transformación (en el panel Resultados), obtendrá:
Alethia Alonso,altethia@example.com,35, Klaus Mauer,klaus@example.com,57, Natsuo Shinohara,natsuo@example.com,29, |
Tal y como muestra el resultado, por cada objeto person del archivo JSON, se crea una fila nueva y las propiedades del objeto están separadas por comas, tal y como se pretendía.
Sin embargo, todavía no hemos creado ninguna conexión entre el campo birthday que existe en el archivo JSON de instancia (aunque no exista en el esquema).
Paso 5: asignar propiedades adicionales
Recuerde que el campo birthday es una propiedad adicional no definida en el esquema. Para leer datos de este tipo de campos MapForce añade elementos al componente JSON.
En este ejemplo, para leer datos del campo birthday debe añadir los siguientes elementos a la asignación:
1.Una constante con el valor "birthday" (véase Agregar una constante a una asignación de datos).
2.Un componente filtro (véase Filtros y condiciones).
3.La función lógica equal (véase Agregar una función integrada a una asignación de datos).
A continuación conecte los componentes como se muestra a continuación. Estas conexiones consiguen que MapForce busque una propiedad adicional llamada birthday y, si encuentra un valor de cadena, lo copie al Campo4 del componente de texto.
En la asignación anterior, el elemento name, bajo property (additional), permite acceder a la propiedad adicional del mismo nombre. Los elementos siguientes (string, number, boolean, etc.) corresponden a tipos de datos JSON y se pueden usar para acceder al valor JSON real de ese tipo. En nuestro ejemplo, el nombre de la propiedad adicional es "birthday" y el tipo es "string", que es la razón de que estos dos elementos estén conectados al filtro.
Si ahora consulta una vista previa del resultado de la transformación (en el panel Resultados), obtendrá:
Alethia Alonso,altethia@example.com,35,4 July Klaus Mauer,klaus@example.com,57,31 August Natsuo Shinohara,natsuo@example.com,29, |
Tal y como muestra el resultado, el cuarto campo CSV incluye ya el valor de la única propiedad adicional de tipo "string": birthday. Además, como la tercera persona no tiene fecha de cumpleaños, no habrá ningún valor en la posición correspondiente del archivo CSV.