Exportar JSon parcial a un mensaje de respuesta
Hola a todos,
Tengo una operación de API que llama a un proceso externo. La respuesta es un gran json, pero solo quiero una parte del contenido completo.
Mi primer intento es:
.....
// Se omite el código de preparación de la solicitud.
establecer tSC = ..Adapter.SendFormDataArray (.tHttpResponse, "POST", tHttpRequest ,,, tURL)
si $$$ ISERR (tSC) $$$ ThrowStatus (tSC)
// Obtén la respuesta directamente
establecer respuesta = ""
while (tHttpResponse.Data.AtEnd = 0) {
establecer respuesta = respuesta_tHttpResponse.Data.Read ()
}
// Convierta Json en un objeto genérico, obtenga el nodo returnValue.data y convierta a JSon nuevamente
set objJson = ## class (% DynamicObject).% FromJSON (respuesta)
establecer jsonReturnValue = objJson.returnValue.data.% ToJSON ()
$$$ TRACE ("Content ReturnValue:" _jsonReturnValue)
do ## class (% ZEN.Auxiliary.jsonProvider).% ConvertJSONToObject (jsonReturnValue, "MyMsg.PartialJson",. pResponse)
......
La respuesta de JSon es:
{ "result": "OK", "returnValue": { "code": "0", "message": "Info", "data": { "ext_customer_id": "123456789", "customer_name": "FRANCISCO", "customer_surname_1": "LÓPEZ", "customer_surname_2": "DE LAS HERAS", "passport_id": "123456ZZZ", "dob": "1972-02-01", "sex": "M", "email": "kurro.lopez@gmail.com", "active": true } } }
y la clase MyMsg.PartialJson es:
Class MyMsg.PartialJson extiende Ens.Response
{
/// Id del usuario
Propiedad "ext_customer_id" como% String (MAXLEN = 1024);
/// Nombre del cliente
Propiedad "customer_name" como% String (MAXLEN = 1024);
/// Apellido cliente
Propiedad "customer_surname_1" como% String (MAXLEN = 1024);
/// apellido 2 cliente
Propiedad "customer_surname_2" como% String (MAXLEN = 1024);
/// Passport ID
Propiedad "passport_id" como% String (MAXLEN = 250);
/// Fecha de nacimiento
Propiedad dob As% String (MAXLEN = 20);
/// Sexo
Sexo de la propiedad como% String (MAXLEN = 10);
/// Correo electrónico
Correo electrónico de la propiedad como% String (MAXLEN = 1024);
/// Compruebe si el cliente está activo
Propiedad activa como% booleano;
}
Pero el objeto pResponse está vacío.
¿Hay algun error?
Atentamente
Kurro Lopez
Ir a la publicación original, escrita por @Kurro Lopez
Hola Kurro,
¿En qué versión lo estás probando? Me imagino que no puedes utilizar
%JSON.Adaptor
.En cualquier caso, lo acabo de probar en un
irishealth-community:2020.3.0.221.0
y parece que funciona:Y el resultado de llamar al método de prueba:
Gracias Alberto.
Puede que sea por la versión de Caché, dado que estamos usando la 2017.2.1
Hola Kurro,
Sí, como dices es probable que tenga que ver con la versión, además la función
##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject()
utiliza internamente el deprecado%zen.ProxyObject
y es probable que el comportamiento haya sufrido correcciones desde entonces.En cualquier caso, si te encuentras a veces restringido por la versión que utilizas y necesitas realizar mapeos a mano (simples) de propiedades puedes apoyarte en métodos generados.
Por ejemplo, esta clase provee un método generado - muy simple - para tener un
CopyProperties
que puedas invocar y copie las propiedades.Por lo que en tu clase
MyMsg.PartialJson
sólo necesitas cambiar la herencia:Y a continuación, puedes invocarlo de la siguiente manera para que te copie las propiedades (parciales) de
%DynamicObject
:Gracias nuevamente,
Hace tiempo publiqué un artículo parecido de como copiar parcialmente un objeto en otro. Muy parecido a lo que has mandado.
Copiar parte de las propiedades de un objeto a otro