Pregunta
· 17 abr, 2023

Convertir dentro de una Operación REST; la String (JSON) que nos responde Sistema Destino, a Mensaje Response.

Buenas tardes,

Antes que nada, muchísimas gracias por leer esta duda, y sobre todo por dedicar tiempo en entenderla y en responderla. Gracias.

 

Por favor, necesitaríamos su ayuda. Actualmente estamos desarrollando una Integración REST, y se nos da un caso que nos gustaría comentar con ustedes, a fin de hallar pistas, documentación, ejemplos, o mecanismos para gestionarlo y depurarlo.

En la Operación REST recibimos:

[{"codigo":"5128","descripcion":"LAS ENFERMERAS FRENTE A LOS PROBLEMAS DE SALUD MENTAL","programa":"Probabilidad de contagio ante un accidente hemático.","admitido":1,"desdefecha":"26/10/2022","hastafecha":"26/10/2029","cursohorario":[{"aula":"AULA 1","desdefecha":"2022/12/26","hastafecha":"2022/12/26","desdehora":"16:00:00","hastahora":"20:30:00"},{"aula":"AULA 2","desdefecha":"27/10/2022","hastafecha":"27/12/2022","desdehora":"10:00:00","hastahora":"12:45:00"}],"error":null},{"codigo":"5129","descripcion":"HISTORIA DE SALUD ELECTRONICA DRAGO-AP","programa":"XXXX","admitido":0,"desdefecha":"15/01/2022","hastafecha":"15/01/2029","cursohorario":[{"aula":"AULA MAGNA","desdefecha":"15/01/2022","hastafecha":"15/01/2022","desdehora":"16:00:00","hastahora":"20:30:00"}],"error":null}]

 

E ingenuamente transformamos el String a objeto Mensaje Response mediante:

// se transforma el objeto JSON a un objeto local
set claseAux = ##class(%ZEN.Auxiliary.jsonProvider).%New()
set tSC= claseAux.%ConvertJSONToObject(.linea,"Mensajes.Response.miFormacion.GetCursosAdmitidosResponse",.pResponse,1) 


 

Lo cual implica Excepción:

 
             
Id.: 273670753
Tipo: Error
Texto: ERROR #5002: Error de cache: <LIST>%GetSerial+1^%Library.ListOfObjects.1
Registrado: 2023-04-17 14:04:55.913
Origen: Operaciones.REST.miFormacionv01r00
Sesión: 19206868
Job: 423529
Clase: Ens.MessageHeader
Método: NewResponseMessage
Seguimiento paso a paso: (ninguno)
Pila:
  • $$^%GetSerial+1^%Library.ListOfObjects.1 +4
  • $$^%SerializeObject+2^%Library.ListOfObjects.1 +1
  • $$^%GetSwizzleObject+13^%Library.ListOfObjects.1 +9
  • $$^zNewResponseMessage+5^Ens.MessageHeader.1 +1
  • $$^zMessageHeaderHandler+208^Operaciones.REST.miFormacionv01r00.1 +1
  • $$^zOnTask+42^Ens.Host.1 +1
  • DO^zStart+62^Ens.Job.1 +2

 

Para recapitular, el Sistema Destino nos responde con esta String; la cual sí es un JSON válido tal y como se puede comrpobar en https://jsonlint.com/

[
    {
        "codigo": "5128",
        "descripcion": "LAS ENFERMERAS FRENTE A LOS PROBLEMAS DE SALUD MENTAL",
        "programa": "Probabilidad de contagio ante un accidente hemático.",
        "admitido": 1,
        "desdefecha": "26/10/2022",
        "hastafecha": "26/10/2029",
        "cursohorario": [
            {
                "aula": "AULA 1",
                "desdefecha": "2022/12/26",
                "hastafecha": "2022/12/26",
                "desdehora": "16:00:00",
                "hastahora": "20:30:00"
            },
            {
                "aula": "AULA 2",
                "desdefecha": "27/10/2022",
                "hastafecha": "27/12/2022",
                "desdehora": "10:00:00",
                "hastahora": "12:45:00"
            }
        ],
        "error": null
    },
    {
        "codigo": "5129",
        "descripcion": "HISTORIA DE SALUD ELECTRONICA DRAGO-AP",
        "programa": "XXXX",
        "admitido": 0,
        "desdefecha": "15/01/2022",
        "hastafecha": "15/01/2029",
        "cursohorario": [
            {
                "aula": "AULA MAGNA",
                "desdefecha": "15/01/2022",
                "hastafecha": "15/01/2022",
                "desdehora": "16:00:00",
                "hastahora": "20:30:00"
            }
        ],
        "error": null
    }
]

Siendo nuestros Mensaje Response:

Class Mensajes.Response.miFormacion.GetCursosAdmitidosResponse Extends Ens.Response
{

Property cursos As list Of EsquemasDatos.miFormacion.CursoAdmitido;

Y el EsquemasDatos interno:

Class EsquemasDatos.miFormacion.CursoAdmitido Extends Ens.Response
{

Property codigo As %String(MAXLEN = "");
Property descripcion As %String(MAXLEN = "");
Property programa As %String(MAXLEN = "");
Property admitido As %Boolean;
Property desdefecha As %String(MAXLEN = "");
Property hastafecha As %String(MAXLEN = "");
Property cursohorario As list Of EsquemasDatos.miFormacion.CursoHorario;
Property error As EsquemasDatos.Seguridad.Error;

 

¿De qué manera nos aconsejan depurar, documentarnos, buscar la causa de la Excepción?

 

Para tratar de resolverlo por nosotros mismos hemos considerado utilizar alguna herramienta para convertir el objeto JSON en un objeto que podamos manipular en nuestro código. Por ejemplo, en lugar de utilizar la clase %ZEN.Auxiliary.jsonProvider, podríamos utilizar la clase %Object, que es una clase básica de InterSystems IRIS que permite trabajar con objetos de forma dinámica. El código es:

	Set pResponse = {} // Creamos un objeto vacío
	Set tSC = pResponse.%FromJSON(linea) // Convertimos la respuesta JSON en un objeto
	If $$$ISERR(tSC) {
    	Write "Error al convertir respuesta JSON: ", tSC.GetErrorText(), !
    	Quit
	}
	$$$LOGINFO("pResponse: "_pResponse)

 

Sin embargo de esta forma, sí es verdad que el LOGINFO pinta que disponemos de:

Info 2023-04-17 15:10:46.749 pResponse: 8@%Library.DynamicObject

Ahora bien, en el visor de mensaje se nos ve en azul:

¿De qué manera nos aconsejan depurar, documentarnos, buscar la causa de la Excepción?

¿Pudiera ser que la respuesta JSON de Sistema Destino, no coincida con la definición interna hecha a mano del Mensaje Response y el EsquemasDatos?

Lo pregunto porque: la excepción que se muestra parece indicar que hay un problema al serializar la lista de objetos en Cache ObjectScript. Para depurar este problema, es posible que necesite verificar si la definición de clase de "Mensajes.Response.miFormacion.GetCursosAdmitidosResponse" coincide con el formato del objeto JSON devuelto por el servicio REST. Lo cual en teoría puede hacerse comparando la definición de clase con el objeto JSON.
 

➕🔎🔍Además hemos indagado:

https://community.intersystems.com/post/convert-string-json

https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls...

https://community.intersystems.com/post/how-convert-xml-string-json-obje...

 

¿De qué manera nos aconsejan depurar, documentarnos, buscar la causa de la Excepción?

Muchísimas gracias por su ayuda. Y muchas gracias por respondernos con pasos a seguir, documentación y/o ejemplos. Gracias porque es un alivio contar con el apoyo de ustedes que tienen gran cantidad de práctica, experiencia y conocimientos valiosísimos y muy únicos.

Un saludo.

Product version: IRIS 2020.1
$ZV: IRIS for UNIX (Red Hat Enterprise Linux for x86-64) 2020.1.1 (Build 408U) Sun Mar 21 2021 22:21:14 EDT
Comentarios (2)1
Inicie sesión o regístrese para continuar

Buenas Yone. Sospecho que quizás el problema pueda estar en la definición del objeto GetCursosAdmitidosResponse, según su definición tiene una propiedad cursos:

Property cursos As list Of EsquemasDatos.miFormacion.CursoAdmitido;

Pero lo que enviais para hacer el mapeo de json al objeto comienza así:

[
    {
        "codigo": "5128",
        "descripcion": "LAS ENFERMERAS FRENTE A LOS PROBLEMAS DE SALUD MENTAL",
        "programa": "Probabilidad de contagio ante un accidente hemático.",
        "admitido": 1,
        "desdefecha": "26/10/2022",
        "hastafecha": "26/10/2029",
        "cursohorario": [
            {
                "aula": "AULA 1",

Cuando debiera ser:

"cursos": [
            {
            "codigo": "5128",
            "descripcion": "LAS ENFERMERAS FRENTE A LOS PROBLEMAS DE SALUD MENTAL",
            "programa": "Probabilidad de contagio ante un accidente hemático.",
            "admitido": 1,
            "desdefecha": "26/10/2022",
            "hastafecha": "26/10/2029",
            "cursohorario": [
                {
                    "aula": "AULA 1",

Yo probaría modificando el JSON que estáis enviado para ver si es ese el problema.