PowerBuilder

Procesamiento dinámico de JSON en PowerBuilder 2025 R2

AutorLuis Avilan
Publicado
Procesamiento dinámico de JSON en PowerBuilder 2025 R2, artículo de Luis Avilan
PB

0 visualizaciones

Demo técnico de PowerBuilder 2025 R2

Consumir una API no termina al recibir su respuesta. Una aplicación empresarial también debe validar el JSON, descubrir su estructura, recorrer objetos y arreglos, conservar UTF-8 y convertir los datos en información útil. Demo_json_pb reúne ese flujo en una interfaz visual basada en las clases nativas JSONParser, CoderObject y WebBrowser.

La ventana principal presenta el JSON crudo, un árbol navegable, las rutas detectadas y los valores extraídos.

El problema que resuelve el demo

Las respuestas de una API suelen mezclar valores simples, objetos anidados, arreglos y valores nulos. Si cada acceso se programa con una ruta fija, el código queda estrechamente acoplado a una sola respuesta. Este demo inspecciona cualquier JSON válido en tiempo de ejecución y genera rutas reutilizables como /seller_address/state/name o /pictures/*/secure_url.

Arquitectura y responsabilidades

La lógica JSON permanece en el NVO. La ventana visual solamente organiza acciones y estado, por lo que el gestor puede reutilizarse desde otras ventanas, procesos por lotes o integraciones HTTP.

Carga y validación con JSONParser

of_cargar_json crea un analizador limpio, carga la cadena y devuelve el mensaje producido por LoadString. Una cadena vacía significa que la estructura es válida.

1String ls_error
2
3If IsValid(i_json) Then Destroy i_json
4i_json = Create JSONParser
5ls_error = i_json.LoadString(as_json)
6
7Return ls_error

La ventana conserva una copia del contenido validado en is_json_crudo. Antes de extraer valores, comprueba que el usuario no haya modificado el editor; así evita consultar un árbol que ya no representa el texto visible.

Descubrimiento recursivo de rutas

El recorrido comienza con GetRootItem(). Para cada nodo, GetItemType() determina si se trata de un objeto, un arreglo o un valor final. Los objetos se recorren mediante GetChildKey() y GetChildItem(); los arreglos sustituyen el índice concreto por el comodín *.

1Choose Case le_tipo
2 Case JsonObjectItem!
3 ls_clave = i_json.GetChildKey(al_item, ll_indice)
4 ll_hijo = i_json.GetChildItem(al_item, ll_indice)
5 of_recorrer_rutas(ll_hijo, ls_ruta_hija, as_rutas)
6
7 Case JsonArrayItem!
8 ls_ruta_hija = as_ruta + "/*"
9 of_recorrer_rutas(ll_hijo, ls_ruta_hija, as_rutas)
10End Choose

El comodín unifica elementos con la misma estructura. Por ejemplo, tres fotografías generan una sola opción /pictures/*/url, no tres rutas redundantes. of_agregar_ruta_unica evita duplicados y of_escapar_clave_ruta protege las barras que formen parte del nombre real de una clave.

Expansión de arreglos y extracción tipada

Cuando el usuario elige una ruta con /*, of_expandir_ruta localiza el arreglo, obtiene su cantidad real de elementos y reemplaza el comodín por índices compatibles con JSONParser.GetItemByPath. La recursión permite resolver más de un arreglo dentro de la misma ruta.

1ll_total = i_json.GetChildCount(ll_arreglo)
2For ll_indice = 1 To ll_total
3 ls_ruta_resuelta = ls_prefijo + "/" + String(ll_indice) + ls_sufijo
4 ls_resultado += of_expandir_ruta(ls_ruta_resuelta)
5Next

Al llegar a una ruta exacta, of_obtener_valor_ruta convierte el dato según su tipo nativo.

Visualización HTML dentro de WebBrowser

of_generar_html_navegable construye una página autocontenida con elementos details y summary. JavaScript recrea el árbol, muestra la cantidad de miembros y aplica un color distinto a cadenas, números, booleanos y valores nulos.

Para conservar acentos y caracteres especiales, el JSON y el HTML se convierten explícitamente a Blob con EncodingUTF8!. Después, CoderObject.Base64Encode produce una URI de datos que puede navegarse sin crear archivos temporales.

1lblb_html = Blob(ls_html, EncodingUTF8!)
2ls_html_base64 = lnv_codificador.Base64Encode(lblb_html)
3
4Return "data:text/html;charset=utf-8;base64," + ls_html_base64

Generación de código PowerBuilder

Después de extraer las rutas seleccionadas, el NVO genera un script que crea nvo_gestor_json, carga la respuesta y agrega una llamada a of_extraer_valores por cada selección. El resultado incluye la cabecera de documentación requerida y todas las variables al principio del script.

w_codigo_json permite revisar y copiar el código correspondiente a las rutas elegidas en la ventana principal.

Flujo completo de ejecución

• El usuario simula la respuesta GET o pega un JSON propio.

• w_demo_json envía el contenido a nvo_gestor_json.of_cargar_json.

• El gestor recorre el árbol y devuelve una lista única de rutas dinámicas.

• La ventana genera el HTML UTF-8 y lo muestra mediante WebBrowser.Navigate.

• El usuario selecciona una o varias rutas; los comodines se expanden a índices reales.

• Los valores se presentan como ruta = valor y se crea el script equivalente.

• w_codigo_json muestra el código y permite copiarlo para reutilizarlo.

Aplicaciones prácticas

• Explorar respuestas desconocidas durante la integración con una API.

• Generar mapeos de campos sin codificar de antemano la estructura completa.

• Diagnosticar cambios en contratos JSON y localizar rutas ausentes.

• Construir asistentes para integraciones, pruebas y documentación técnica.

• Reutilizar el mismo NVO con respuestas obtenidas mediante HTTPClient.

Conclusión

Demo_json_pb demuestra que PowerBuilder 2025 R2 puede procesar JSON dinámico sin bibliotecas externas. La combinación de JSONParser, recorrido recursivo, rutas con comodines, codificación UTF-8, HTML embebido y generación de código convierte una respuesta compleja en un flujo visible y reutilizable. La separación entre el NVO y las ventanas mantiene la solución clara y facilita llevar el mismo patrón a integraciones reales.