Artículo
Daniel Aguilar · Oct 10, 2022 Lectura de 3 min

Nueva mejora %ZEN.proxyObject enviar un valor númerico como String.

Hola desarrolladores!,

Ya se lo que estáis pensando. " Una mejora para ZEN.proxyObject...??? ¿Ahora...????

Bueno en España tenemos el dicho de mas vale tarde que nunca.  ;-)

¿Alguna vez has necesitado enviar un atributo numérico de un JSON en formato String?

¿Te volviste loco casteando objetos de clases con propiedades fijas y tipadas?

Pues estás de enhorabuena!! porque ahora podrás hacerlo fácilmente!!.

Con esta nueva mejora os propongo una forma en la que podamos continuar trabajando con nuestros amados objetos dinámicos %ZEN.proxyObject siendo capaces de elegir cuando enviar o no un valor numérico en formato String.

Tu: "Eso es genial!!, pero venga, deja de divagar y explícame como funciona!!".

Yo: "Esa es la mejor parte, es tan simple que hasta un mono podría usarlo (y si un mono puede... tu también!!!).

       Solo tienes que añadir una "x" en tu llamada myObjeto.%ToJSON(,"x")

       Y mágicamente todos los valores numéricos serán convertidos a Strings!!!.

Tu: "¿Me estás tomando el pelo?, ¿Pero que pasa si solo quiero convertir uno o varios atributos??"

Yo: "No hay ningún problema!, he añadido 2 nuevas propiedades a la clase proxyObject:

  • forceStringFormat
  • excludeStringformat

        Ambas propiedades son listas así que simplemente añade el nombre de la propiedad que tu quieras traducir a forceStringFormat o excludeStringFormat y será forzada a ser convertida o ignorada de ser convertida a formato String!!.

 

Ejemplo de uso:

CODIGO:

ClassMethod testJson() As %Status
{
	#Dim objectA As %ZEN.proxyObject
	Set objectA=##class(%ZEN.proxyObject).%New()
	
	Set objetoB=##class(%ZEN.proxyObject).%New()
	Set objetoB.phone2=961365378
	Set objetoB.name="Dani"
	Set objectA.objetoB=objetoB
	Set objectA.phone=964121214
	u 0 w "NORMAL",!
	
	Do objectA.%ToJSON()
	
	U 0 W "",!,!
	
	u 0 w "WITH PARAMETER",!
	Do objectA.%ToJSON(,"aelotwux")
	
	U 0 W "",!,!
	
	u 0 w "WITH PARAMETRO AND EXCLUDED",!
	Do objectA.excludeStringformat.Insert("phone")
	Do objectA.%ToJSON(,"aelotwux")
	
	U 0 W "",!,!
	
	u 0 w "WITH FORCED LIST",!
	Do objectA.forceStringFormat.Insert("phone")
	Do objectA.%ToJSON()
}

 

RESULTADO:

NORMAL
{
        "objetoB": {
                "name":"Dani",
                "phone2":961365378
        },
        "phone":964121214
}
 
WITH PARAMETER
{
        "objetoB": {
                "name":"Dani",
                "phone2":"961365378"
        },
        "phone":"964121214"
}
 
WITH PARAMETRO AND EXCLUDED
{
        "objetoB": {
                "name":"Dani",
                "phone2":"961365378"
        },
        "phone":964121214
}
 
WITH FORCED LIST
{
        "objetoB": {
                "name":"Dani",
                "phone2":961365378
        },
        "phone":"964121214"
}

 

Espero que os sirve de ayuda, aunque puede que la ayuda llegue tarde ;-)

Gracias por leerme!!

Os dejo un enlace al repositorio de GitHub desde el que podréis descargar los 2 xml modificados para importarlos directamente arrastrando al Studio (por ejemplo).

https://github.com/DanielAguilarGarcia/CustomZenProxy

1
0 28
Debate (1)1
Inicie sesión o regístrese para continuar

Seguro que hay todavía mucho %ZEN.proxyObject por ahí. ¡¡Nunca es tarde si la dicha es buena!! wink

La única precaución es que %ZEN.proxyObject es una clase de sistema... Si la modificamos, hay que preservarla en las actualizaciones y validar que no haya cambiado o hacer un merge... de otro modo perderemos los cambios nuestros o las correcciones de producto.

Por "IRIS-izarlo" un poco... aunque no tan automático como lo que presentas, podemos también alterar temporalmente los tipos en los %Library.DynamicObject.

set obj = {}
set objB = {}

set objB.phone = 961000000

set obj.phone = 91001001
set obj.nombre = "Luis"
set obj.objetoB = objB

set orig = obj.%GetSerial() //si queremos preservar el valor original
do obj.%Set("phone",obj.phone,"string")
do objB.%Set("phone",objB.phone,"string")

do obj.%ToJSON()

set obj = obj.%SetSerial(orig)  //para volver al objeto JSON original
do obj.%ToJSON()

Resultado:

{"phone":"91001001","nombre":"Luis","objetoB":{"phone":"961000000"}}
{"phone":91001001,"nombre":"Luis","objetoB":{"phone":961000000}}

Igual sería interesante ver todas las posibilidades de formateo de las antiguas clases %ZEN y ver si están cubiertas por %Dynamic*, %JSON.Adaptor y %JSON.Formatter,... y, si no,... pues igual toca funcionalidad nueva en OpenExchange! :laugh