Pregunta
· 8 feb, 2024

Deserializar una clase JSon con nodos nulos

Hola a todos,

Tenemos una clase response heredada de %JSON.Adaptor con las siguientes propiedades, también sus clases dependientes:

 
Kurro.app.Msg.Search.Response
 
Kurro.app.Msg.Common.SearchCriteria
 
Kurro.app.Msg.Common.Availability
 
Kurro.app.Msg.Common.Acts
 
Kurro.app.Msg.Common.Parameters

Nota: No he escrito todos los nodos.

Cuando llamamos al API del proveedor, recibimos el siguiente JSon

 
JSon response from provider

Y usamos el siguiemte comando para deserializar la respuesta

set tHttpResponse = ##class(%Net.HttpResponse).%New()
set tSC = ..Adapter.SendFormDataArray(.tHttpResponse,verbo,tHttpRequest,,,tUrl)
set content = ""
while (tHttpResponse.Data.AtEnd = 0) { 
   set content = content_tHttpResponse.Data.Read() 
}
do pResponse.%JSONImport(content)

Como puedes ver, el proveedor ha devuelto un valor nulo en el nodo availability.acts.actParameters, en lugar de un array de datos, y la deserialización del JSon genera un error.

¿Cómo tenemos que definir nuestra clase para evitar este tipo de error? Me refiero, si la respuesta en un valor nulo, ignorar este error y continuar con el resto del contenido.

Gracias por adelantado.

Product version: IRIS 2021.1
$ZV: IRIS for Windows (x86-64) 2021.1.3 (Build 389U) Wed Feb 15 2023 14:50:06 EST
Comentarios (2)2
Inicie sesión o regístrese para continuar

Hola,

El %JSONIGNORENULL lo que te hace es que si el valor viene como nulo, para los strings lo marca como cadena vacía.

El problema es que si guardamos la cadena con el JSon, y desde el terminal hago lo mismo de importación nos da el siguiente mensaje de error.

w pResponse.%JSONImport(content)

e^%JSONImportInternal+57^Kurro.app.Msg.Search.Response.1^1$e^%JSONImport+12^%JSON.Adaptor.1^1)e^zLoop+16^|"USER"|WebTerminal.Core.1^1)x^zLoop+16^|"USER"|WebTerminal.Core.1^1d^^^0

Como ves, no nos da muchas pistas de por donde va el error. Probando varias combinaciones, hemos llegado a que funcione si cambian el nodo de actParameters por [] en lugar de null.

Ya hemos hablado con el proveedor para que en esos caso, nos devuelva un array vacío en lugar de un valor nulo.

Muchas gracias por tu respuesta Luis Angel