Pregunta
· 9 mayo, 2023

El secreto mejor guardado: la forma idónea de convertir un Objeto de Ensemble a JSON

Buenos días,

Antes que nada agradecer el tiempo de ustedes al leer, reflexionar y sobre todo responder y aclarar las dudas.

 

Tenemos una cuestión:

¿Cuál es la forma recomendada de convertir un Objeto de Ensemble a JSON?,

en concreto, para ser más preciso:

¿cuál es la manera idónea de transformar un Mensaje Response con cualquier tipo de Property: %String, %List of String, otros objetos de Ensemble (EsquemasDatos); a un GlobalCharacterStream que represente al JSON? a retornar a Sistema Origen, desde el Servicio.

 

Porque en el equipo, a lo que estamos acostumbrados en los Servicios REST es a emplear el:

set claseAux = ##class(%ZEN.Auxiliary.jsonProvider).%New()

[...]

set tSC = claseAux.%WriteJSONStreamFromObject(.pOutput,.objetoSalida,,,,"aeloqtuw")

	Set pOutput=##class(%GlobalBinaryStream).%New()
	set claseAux = ##class(%ZEN.Auxiliary.jsonProvider).%New()

	//Sacamos el body
	set body = pInput.Read()
	
	//Lo convertimos a Mensaje
	set tSC= claseAux.%ConvertJSONToObject(.body,"Mensajes.Request.miFormacion.LoginRequest",.objetoEntrada,1)
	
	//Enviamos al Proceso
	set tSC = ..SendRequestSync("miFormacionv01r00",objetoEntrada,.objetoSalida)
	
	//Convertimos el OBJETO devuelto por el Proceso en JSON
	#dim objetoSalida As Mensajes.Response.miFormacion.LoginResponse
	set tSC = claseAux.%WriteJSONStreamFromObject(.pOutput,.objetoSalida,,,,"aeloqtuw")
	
	//Enviamos el JSON con cabeceras 
	Do:$$$ISOK(tSC) pOutput.SetAttribute("Content-Type","application/json")
	do pOutput.SetAttribute("Access-Control-Allow-Origin","*")
	do pOutput.SetAttribute("Access-Control-Allow-Credentials","true")
	do pOutput.SetAttribute("Access-Control-Allow-Methods","GET")
    do pOutput.SetAttribute("Access-Control-Allow-Headers","request,Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers")
	Quit tSC

 

Sin embargo ¿cuál es la manera recomendada por ustedes desde InterSystems para realizar esta conversión?

 

De nuevo; gracias por el tiempo de ustedes al leer, reflexionar y sobre todo responder y aclarar las dudas.

 

Un saludo.

Product version: IRIS 2021.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 (3)1
Inicie sesión o regístrese para continuar

Gracias Luis Ángel Pérez.

En el hilo, se explican 3 formas de convertir Objeto a JSON, ahora bien; ¿cuál de las 3 es la recomendada por Intersystems, la preferible y/o estándar y por qué?

Eduard Lebedyuk expone 2 alternativas:

1º Utilizar la clase "result set" para contener los resultados:

Para utilizar esta opción, se debe crear una clase que extienda de %RegisteredObject y %JSON.Adaptor que tenga propiedades para contar los resultados (count) y una lista de los mismos (results). Por ejemplo:

Class Test.JSONRS Extends (%RegisteredObject, %JSON.Adaptor)
{
Property count As %Integer;
Property results As list Of Book;
}

Luego, se puede convertir un objeto normal a un objeto dinámico y asignarlo a la propiedad results de la clase Test.JSONRS utilizando la función %ObjectToAET:

set dynObj = ##class(%ZEN.Auxiliary.altJSONProvider).%ObjectToAET(obj)
set resultSet = ##class(Test.JSONRS).%New()
set resultSet.count = <cantidad de resultados>
set resultSet.results = dynObj
set jsonString = resultSet.%ToJSON()

2º Utilizar un enfoque más simple:

En esta opción, se genera el JSON directamente utilizando la función %JSONExport para cada objeto y concatenando los resultados. Por ejemplo:

set jsonString = {"results": <cantidad de resultados>, "items": [
##class(%JSON.Adaptor).%JSONExport(obj1)_", "_##class(%JSON.Adaptor).%JSONExport(obj2)_", "_...]}

Este enfoque es más simple pero puede ser menos eficiente en términos de uso de memoria y tiempo de ejecución. Sin embargo, puede ser más adecuado para casos en los que se trabaja con un pequeño número de objetos.
 

Por otro lado, Muni Ganesh explica esta 3ª vía:

Emplear la función "%ToJSON()" para convertir el objeto "MainObj" a formato JSON y se imprime el resultado.
 

   set array=[]
   set obj = {}
   set obj.title="For Whom the Bell Tolls"
   set obj.author="Hemmingway"
   do array.%Push(obj)    

   set obj = {}
   set obj.title="The Invisible Man"
   set obj.author="Ellison"
   do array.%Push(obj)    

   set obj = {}
   set obj.title="Tender is the Night"
   set obj.author="Fitzgerald"
   do array.%Push(obj)    

 set arraylen=0 
 set iter = array.%GetIterator()
   while iter.%GetNext() {
      set arraylen=$I(arraylen)
   }
   
   set MainObj={}
   set MainObj.results=arraylen
   set MainObj.items=array
   
   w MainObj.%ToJSON()
----------------------------------------------------------------------------------------------------------------

Output:

{"results":3,"items":[{"title":"For Whom the Bell Tolls","author":"Hemmingway"},{"title":"The Invisible Man","author":"Ellison"},{"title":"Tender is the Night","author":"Fitzgerald"}]}

--------------------------------------------------------------------------------------------------------------------

Desarrollando una integración en el ámbito de la interoperabilidad sanitaria, en un Servicio REST ¿cuál es la forma aconsejada por ustedes en Intersystems para convertir Objeto a JSON?

¿Cuál de las 3 es la recomendada por Intersystems, la preferible y/o estándar y por qué?
 

Gracias, muchas gracias por leer y responder, un saludo.