Seguro que os ha pasado: llega un JSON de una API que no controláis, queréis volcarlo a un DataWindow… pero no sabéis la estructura de antemano y, además, cada elemento del array puede traer más o menos campos. Un lío para montar el DataWindow "a mano".
Este ejemplo demuestra cómo convertir un JSON a un DataStore sin usar el objeto Transaction y sin conocer de antemano la estructura del JSON. La app inspecciona el JSON, deduce las columnas sobre la marcha y te deja los datos en un DataStore listo para usar.
El truco está en aceptar una premisa razonable y trabajar a partir de ahí:
- El JSON de entrada es un array de objetos JSON.
- Cada objeto puede tener más o menos campos que los demás (no pasa nada).
- Si un campo es a su vez un array u otro JSON anidado, no lo intentamos explotar en columnas: lo guardamos como string en su columna. Así nada se rompe y no pierdes la información.
Con eso, el ejemplo:
- Recorre el array y descubre el conjunto de campos que aparecen.
- Construye dinámicamente un DataStore con esas columnas.
- Vuelca cada elemento, metiendo los anidados como texto.
Los objetos clave que tenéis dentro:
| Objeto | Para qué sirve |
|---|---|
u_datastore.sru |
DataStore extendido que recibe el JSON y se autoconfigura. |
u_datawindow.sru |
Variante para DataWindow visual. |
w_main.srw |
La ventana de demostración. |
Todo sin tocar el objeto Transaction: aquí no hay tabla ni base de datos detrás, solo el JSON y un DataStore en memoria.
- PowerBuilder 2025 para abrir la solución y compilar.
- Nada más: el ejemplo no necesita base de datos.
- Clona el repo (viene en modo solución).
- Abre
jsontodw.pbslnen el IDE de PowerBuilder. - Ejecuta
w_main, dale un JSON (array de objetos) y mira cómo aparece volcado en el DataStore.
¿Solo quieres verlo? Tenéis el
jsondw.exeya compilado en la carpeta.
Ejemplo publicado en modo solución: https://github.com/rasanfe/jsontodw
¡Nos vemos en el próximo artículo! Y recuerda: en PowerBuilder, los límites solo están en nuestra imaginación. 🚀
📨 Blog: https://rsrsystem.blogspot.com/