Pregunta
· 23 sep, 2020

Problema con estructura JSON

Buenas

Tengo un problema al intentar realizar un json de un clase que he creado para el recurso FHIR Appointment, el problema lo tengo al nivel del actor, si miro la documentación de FHiR puedo acceder al siguiente ejemplo, para simplificar el entendimiento solo voy a poner en el json y en las clases los elementos que hago referencia.

"participant": [
    {
      "actor": {
        "reference": "Practitioner/example",
      },
    },
    {
      "actor": {
        "reference": "Location/1",
      },
    }
  ] Los dos Actor estan en un mismo corchete
  • Para esta estructura he creado las siguientes clases:

Class Test.FHIR.Resources.Appointment Extends (Ens.Response, Ens.Request, Ens.Util.MessageBodyMethods)
{ .....

Property participant As list Of Test.FHIR.Components.participant;

  • participant es una lista con la siguiente propiedad

Class Test.FHIR.Components.participant Extends (Ens.Response, Ens.Util.MessageBodyMethods)

{ Property actor As list Of Test.FHIR.Components.actor;

  • actor es otra lista con la siguiente propiedad reference como string

Class Test.FHIR.Components.actor Extends (Ens.Response, Ens.Util.MessageBodyMethods)
{ Property reference As %String;

  • Cuando realizo la transformación a JSON

#Dim tProxy As Test.FHIR.Resources.Appointment;
 Set tsc = ##class(%ZEN.proxyObject).%New()
 Set tProxy = ##class(Test.FHIR.Resources.Appointment).%New()
 Set tSC = tProxy.participant.Insert(##class(Test.FHIR.Components.participant).%New())
 Set tSC = tProxy.participant.GetAt(1).actor.Insert(##class(Test.FHIR.Components.actor).%New())  

 
 Set tProxy.participant.GetAt(1).actor.GetAt(1).reference = "Patient/12345"
 
  //Caso 1 
  Set tSC = tProxy.participant.GetAt(1).actor.Insert(##class(Test.FHIR.Components.actor).%New())
  Set tProxy.participant.GetAt(1).actor.GetAt(2).reference = "Practitioner/145" 

Aqui vemos como se pinta en json

{ ....

"participant":[ {

"actor":[ {

"reference":"Patient\/12345" },

{ "reference":"Practitioner\/145" }

]

}] } Un unico corchete pero solo un actor


  //Caso 2
  Set tSC = tProxy.participant.Insert(##class(Test.FHIR.Components.participant).%New())
  Set tSC = tProxy.participant.GetAt(2).actor.Insert(##class(Test.FHIR.Components.actor).%New())
  Set tProxy.participant.GetAt(2).actor.GetAt(1).reference = "Practitioner/145"
 

{  "participant":

[ { "actor":[

{ "reference":"Patient\/12345" }

] },

{ "actor":[

{ "reference":"Practitioner\/145" }

]

}] } Dos actor pero dos corchetes

 

Como se observa no consigo replicar la estructura del JSON del ejemplo de FHIR.

Si intento duplicar el actor en  Test.FHIR.Components.participant me da el siguiente error, como es logico

Element name conflict [80670005] : Property actor

¿Como podria solucionarlo?

Comentarios (6)1
Inicie sesión o regístrese para continuar

Hola Jose,

No sé exactamente con qué versión estás probando pero estás utilizando %ZEN.proxyObject en lugar de las funcionalidades que incorpora IRIS para trabajar con JSON.

Échale un vistazo a Using JSON.

Por ejemplo,

USER>set json={ "participant": [ {"actor": { "reference": "Practitioner/example" } }, { "actor": { "reference": "Location/1"} } ] }

USER>write json.participant.%Get(0).actor.reference
Practitioner/example

USER>write json.participant.%Get(1).actor.reference
Location/1

Hola de nuevo José,

En la versión 2018 tienes algunas de esas funcionalidades disponible, mira la documentación aquí: https://cedocs.intersystems.com/latest/csp/docbook/Doc.View.cls?KEY=GJSON_preface

Intenta utilizar los %DynamicObjects en lugar de %ZEN.proxyObject.

En todo caso, si sólo puedes usar %ZEN.proxyObject y encuentras un problema, siempre puedes abrir un caso de soporte WRC para que investigarlo en detalle.

Buenas Alberto,

La documentación la habia leido y no me soluciono el problema. No se como implementarlo en mi codigo. Para mi el problema no es en la transformación de json si no pq una clase no permite dos propiedades iguales(actor). Yo en el tProxy cargo valores, pero la estructura del tProxy es la que define como sera el json, no puedo meter en una clase dos atributos iguales y tengo el problema.

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.