Escrito por

Project Manager & Head of Interoperability at Salutic Soluciones, S.L.
Pregunta Kurro Lopez · feb 8, 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

 
{
  "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.

Product version: IRIS 2021.1
$ZV: IRIS for Windows (x86-64) 2021.1.3 (Build 389U) Wed Feb 15 2023 14:50:06 EST

Comments

Kurro Lopez  feb 9, 2024 to Luis Angel Pérez Ramos

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

0