Publicaciones recientes:
Respuestas recientes:

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.

/// Clase auxiliar para copiar propiedades de objetos que tengan el mismo nombre
Class MyMsg.ObjCopy Extends %RegisteredObject
{

/// Método generado que copia las propiedades (con el mismo nombre) de un objeto en el actual
/// -obj: objeto del cual se quieren copiar las propiedades  
Method CopyProperties(ByRef obj) As %Status [ CodeMode = objectgenerator ]
{
    set properties = %compiledclass.Properties
    for i=1:1:properties.Count() {
        #dim prop As %Dictionary.CompiledProperty = properties.GetAt(i)
        if prop.Name'="",prop.Name'["%" {
            set propName = prop.Name
            if prop.Name["_" { 
                set propName = """"_prop.Name_""""
            }

            // set ..x = obj.x
            do %code.WriteLine(" set .."_propName _"=obj."_propName)
        }
    }
    quit 1
}

}

Por lo que en tu clase MyMsg.PartialJson sólo necesitas cambiar la herencia:

Class MyMsg.PartialJson Extends (Ens.Response, ObjCopy)

Y a continuación, puedes invocarlo de la siguiente manera para que te copie las propiedades (parciales) de %DynamicObject:

    set partialJsonObj = ##class(MyMsg.PartialJson).%New()
    do partialJsonObj.CopyProperties(objJson.returnValue.data)
    write !!,"** partialJsonObj (copied):",!
    zw partialJsonObj

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:

Class MyMsg.PartialJson Extends Ens.Response
{

Property "ext_customer_id" As %String(MAXLEN = 1024);

Property "customer_name" As %String(MAXLEN = 1024);

Property "customer_surname_1" As %String(MAXLEN = 1024);

Property "customer_surname_2" As %String(MAXLEN = 1024);

Property "passport_id" As %String(MAXLEN = 250);

Property dob As %String(MAXLEN = 20);

Property sex As %String(MAXLEN = 10);

Property email As %String(MAXLEN = 1024);

Property active As %Boolean;

ClassMethod Test()
{
    set file = ##class(%Stream.FileCharacter).%New()
    set file.Filename = "/test/data.json"
    set data = file.Read()
    set objJson = ##CLASS(%DynamicObject).%FromJSON(data)
    set jsonReturnValue = objJson.returnValue.data.%ToJSON()
    write !!,"** jsonReturnValue:",!,jsonReturnValue

    set sc = ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(jsonReturnValue, "MyMsg.PartialJson", .pResponse)
    write !!,"** %ConvertJSONToObject: ",!,sc

    write !!,"** Converted object:",!
    zw pResponse
}

Y el resultado de llamar al método de prueba:

USER>do ##class(MyMsg.PartialJson).Test()


** jsonReturnValue:
{"ext_customer_id":"123456789","customer_name":"FRANCISCO","customer_surname_1":"LOPEZ","customer_surname_2":"DE LAS HERAS","passport_id":"123456ZZZ","dob":"1972-02-01","sex":"M","email":"kurro.lopez@gmail.com","active":true}

** %ConvertJSONToObject: 
1

** Converted object:
pResponse=5@MyMsg.PartialJson  ; <OREF>
+----------------- general information ---------------
|      oref value: 5
|      class name: MyMsg.PartialJson
| reference count: 2
+----------------- attribute values ------------------
|       %Concurrency = 1  <Set>
|             active = 1
|      customer_name = "FRANCISCO"
| customer_surname_1 = "LOPEZ"
| customer_surname_2 = "DE LAS HERAS"
|                dob = "1972-02-01"
|              email = "kurro.lopez@gmail.com"
|    ext_customer_id = 123456789
|        passport_id = "123456ZZZ"
|                sex = "M"
+-----------------------------------------------------

Hola de nuevo,

No entiendo muy bien cuál es el objetivo de lo que estás intentando hacer.

¿Estás intentando construir un objeto participant con dos actors para después obtener su representación JSON y poder enviarlo a algún sitio?

En la versión 2018, puedes construir la jerarquía de objetos que necesites y después transformarla tú mismo a un %DynamicObject con la estructura que quieras utilizando. Mira Creating and Modifying Dynamic Entities.

En IRIS / Health Connect además tendrías la posibilidad de %JSON.Adaptor que es mucho más cómodo.

¿Has recibido esa cadena JSON y estás intentando pasearla a un objeto?

Puedes convertir la cadena JSON a un %DynamicObject y acceder a todos las propiedades (e.g. arrays, objetos, etc.) en forma de objetos para poder trabajar con ellos como prefieras. Mira Converting Dynamic Entities to and from JSON

De todas formas, si no estás familiarizado con estas clases o incluso necesitas que algún especialista se conecte contigo y te echemos una mano no dudes por favor en abrir un caso de soporte WRC para que te podamos ayudar con más detalle.

Aplicaciones de Open Exchange:
Seguidores:
Siguiente:
Alberto aún no sigue a nadie.
Insignias de Maestros Globales: