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
{
"searchCriteria": [{
"professionalNif": null,
"specialtyCode": "SPCODE17",
"acts": [
{
"actcode": "ACTCODE20",
"actModality": null,
"actPreparation": null,
"actParameters": [
{
"parameterCode": "contraste",
"parameterValue": "false"
}
]
}
]
}],
"availability": [
{
"acts": [
{
"actcode": "ACTCODE20",
"actModality": "",
"actPreparation": null,
"actParameters": null
}
],
"slots": [
{
"day": "2024-02-15",
"hours": [
{
"hour": "2024-02-15T18:20+01:00",
"duration": 20
},
{
"hour": "2024-02-15T18:40+01:00",
"duration": 20
},
{
"hour": "2024-02-15T19:00+01:00",
"duration": 20
},
{
"hour": "2024-02-15T19:20+01:00",
"duration": 20
},
{
"hour": "2024-02-15T19:40+01:00",
"duration": 20
}
]
}
],
"reasonNotAvailability": null
}
]
}
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.
Comments
Buenas Kurro. ¿Has probado definiendo el parámetro como %JSONIGNORENULL?
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cl…
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