Hello @PhoebeK 

If emailAttachmentList is a DynamicArray, then the following property declaration is correct:

Attempt 2 // 
Property emailAttachmentList As List of Request.EmailAttachment(%JSONFIELDNAME = "emailAttachmentList");

It looks like you're trying to set the value directly like:
    callrequest.emailAttachmentList.attachmentClass = "application/xml"

However, since emailAttachmentList is a list, you need to either:
- Use %JSONImport(response) to populate the list properly (e.g., `callrequest.%JSONImport(response)`), or
- Loop through the list and set the property on each individual item, like this:

For i=1:1:callrequest.emailAttachmentList.Count() {
  Set callrequest.emailAttachmentList.GetAt(i).attachmentClass = "application/xml"
}

Hello @Scott Roth 
I hope the target is a object reference of  HS.FHIRModel.R4.Patientand the "name" property in in R4.Patient is an object property(HS.FHIRModel.R4.SeqOfHumanName ) and thisSeqOfHumanName stores the %DynamicArray of  HS.FHIRModel.R4.HumanName object values into property called "list" 

So, First we have to check the name is  $IsObject(r4Patient.name)&&(r4Patient.name.%IsA("HS.FHIRModel.R4.SeqOfHumanName")) and if it's true you can iterate the list (%DynamicArray)   Set iter = r4Patient.name.list.%GetIterator()

You can directly copy and run this example directly and it works for me.

ClassMethod ParseHumanName()
{
    Set r4Patient = ##class(HS.FHIRModel.R4.Patient).%New()
    ;
    Set seqHuman = ##class(HS.FHIRModel.R4.SeqOfHumanName).%New()
    ; create human name for seqHuman
    Set human = ##class(HS.FHIRModel.R4.HumanName).%New()
    Set human.family="pil"
    Set human.text="Ashok,kumar"
    ;
    ;push the HumanName into SeqOfHumanName
    Do seqHuman.add(human)
    
    ; Set SeqOfHumanName into Patient.name
    Set r4Patient.name = seqHuman
    
    If $IsObject(r4Patient.name)&&(r4Patient.name.%IsA("HS.FHIRModel.R4.SeqOfHumanName")) {
        Set iter = r4Patient.name.list.%GetIterator()
        #;
        while iter.%GetNext(,.humanName) {
            zw humanName.toDao()
        }
    }
    quit
}

The HS.FHIRModel.R4.Patient class in  IRIS directly represents the FHIR R4 Patient resource as defined. When a FHIR Bundle is loaded using HS.FHIRModel.R4.Bundle.fromDao(), each resource in the bundle's entry.resource is automatically mapped to the correct HS.FHIRModel.R4.* subclass (e.g., Patient, Encounter, AllergyIntolerance) based on its resourceType. There’s no need for manual casting — the object model handles the typing internally.

here is the sample code

Set bundle={"resourceType":"Bundle","type":"searchset","total":3,"entry":[{"fullUrl":"https://example.org/fhir/Patient/patient-1","resource":{"resourceType":"Patient","id":"patient-1","name":[{"family":"Doe","given":["John"]}],"gender":"male","birthDate":"1985-02-15"},"search":{"mode":"match"}},{"fullUrl":"https://example.org/fhir/Encounter/encounter-1","resource":{"resourceType":"Encounter","id":"encounter-1","status":"finished","class":{"system":"http://terminology.hl7.org/CodeSystem/v3-ActCode","code":"AMB","display":"ambulatory"},"subject":{"reference":"Patient/patient-1"},"period":{"start":"2023-07-01T10:00:00Z","end":"2023-07-01T10:30:00Z"}},"search":{"mode":"include"}},{"fullUrl":"https://example.org/fhir/AllergyIntolerance/allergy-1","resource":{"resourceType":"AllergyIntolerance","id":"allergy-1","clinicalStatus":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical","code":"active"}]},"verificationStatus":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/allergyintolerance-verification","code":"confirmed"}]},"type":"allergy","category":["food"],"criticality":"high","code":{"coding":[{"system":"http://snomed.info/sct","code":"227493005","display":"Cashew nuts"}],"text":"Allergy to cashews"},"patient":{"reference":"Patient/patient-1"},"reaction":[{"manifestation":[{"coding":[{"system":"http://snomed.info/sct","code":"271807003","display":"Skin rash"}]}],"severity":"moderate"}]},"search":{"mode":"include"}}]}                                                                                             
set fhirModelBundle = ##class(HS.FHIRModel.R4.Bundle).fromDao(bundle)  
;
Zwrite fhirModelBundle.entry.list.size()
3
;
Zwrite fhirModelBundle.entry.list.get(0).toDao() ; patient
{"fullUrl":"https://example.org/fhir/Patient/patient-1","resource":{"resourceType":"Patient","id":"patient-1","name":[{"family":"Doe","given":["John"]}],"gender":"male","birthDate":"1985-02-15"},"search":{"mode":"match"}}  ; <DYNAMIC OBJECT>                        
;
Zwrite fhirModelBundle.entry.list.get(1).toDao() ; encounter
{"fullUrl":"https://example.org/fhir/Encounter/encounter-1","resource":{"resourceType":"Encounter","id":"encounter-1","status":"finished","class":{"system":"http://terminology.hl7.org/CodeSystem/v3-ActCode","code":"AMB","display":"ambulatory"},"subject":{"reference":"Patient/patient-1"},"period":{"start":"2023-07-01T10:00:00Z","end":"2023-07-01T10:30:00Z"}},"search":{"mode":"include"}}  ; <DYNAMIC OBJECT>                                                                                                                         
;
Zwrite fhirModelBundle.entry.list.get(2).toDao() ; Allergy
{"fullUrl":"https://example.org/fhir/AllergyIntolerance/allergy-1","resource":{"resourceType":"AllergyIntolerance","id":"allergy-1","clinicalStatus":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical","code":"active"}]},"verificationStatus":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/allergyintolerance-verification","code":"confirmed"}]},"type":"allergy","category":["food"],"criticality":"high","code":{"coding":[{"system":"http://snomed.info/sct","code":"227493005","display":"Cashew nuts"}],"text":"Allergy to cashews"},"patient":{"reference":"Patient/patient-1"},"reaction":[{"manifestation":[{"coding":[{"system":"http://snomed.info/sct","code":"271807003","display":"Skin rash"}]}],"severity":"moderate"}]},"search":{"mode":"include"}}  ; <DYNAMIC OBJECT>

Hello @Scott Roth 

I directly import JSON via fromDao method and It works for me. Did you get any errors while importing?

Set patient = {"resourceType":"Patient","id":"example","text":{"status":"generated","div":"<div xmlns=\"http://www.w3.org/1999/xhtml\">John Doe</div>"},"identifier":[{"use":"usual","type":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v2-0203","code":"MR","display":"Medical Record Number"}]},"system":"http://hospital.smarthealth.org","value":"123456"}],"active":true,"name":[{"use":"official","family":"Doe","given":["John"]}],"telecom":[{"system":"phone","value":"+1 555-123-4567","use":"mobile"},{"system":"email","value":"john.doe@example.com","use":"home"}],"gender":"male","birthDate":"1980-01-01","address":[{"use":"home","line":["123 Main Street"],"city":"Anytown","state":"CA","postalCode":"90210","country":"USA"}]}
Set r4Patient = ##class(HS.FHIRModel.R4.Patient).fromDao(patient)
Write r4Patient.toString()

In the above example, the list property holds a %DynamicObject value, not a string literal. Therefore, you can use DAO (Dynamic Access Object) methods to work with it. However, if you're using the latest IRIS version (2023.2 or later), you can also use the apply method to retrieve the family and given fields directly from the %DynamicObject.

Version 2024.1

Write r4Patient.name.list.apply("$[*].family").%ToJSON()
write r4Patient.name.list.apply("$[*].given").%ToJSON()

For older versions that do not support the apply method, you can use traditional JSON access techniques:

/// loop by size
for i=0:1:r4Patient.name.list.size()-1 {
    Set humanName = r4Patient.name.list.%Get(i)
    Write humanName.family_"  "_humanName.given
}

Using an iterator:


/// By iterator
Set iter = r4Patient.name.list.%GetIterator()
While iter.%GetNext(,.humanName) {
    Write humanName.family_"  "_humanName.given
}

Sample code for the human name testing


ClassMethod FHIRHunmanNameTest()
{
    Set r4Patient = ##class(HS.FHIRModel.R4.Patient).%New()
    ;
    Set seqHuman = ##class(HS.FHIRModel.R4.SeqOfHumanName).%New()
    Set human = ##class(HS.FHIRModel.R4.HumanName).%New()
    Set human.family="pil"
    Set human.text="Ashok,kumar"
    ;
    Set human1 = ##class(HS.FHIRModel.R4.HumanName).%New()
    Set human1.family="pil"
    Set human1.text="Ashok,kumar"
    ;
    ; seq string
    Set seqString = ##class(HS.FHIRModel.R4.SeqOfString).%New()
    Set seqString.list=["ashok","kumar"]
    ;
    Set human1.given=seqString
    ;
    Do seqHuman.add(human.toDao())
    Do seqHuman.add(human1.toDao())
    
    Set r4Patient.name = seqHuman
    
    Set iter = r4Patient.name.list.%GetIterator()
    
    While iter.%GetNext(,.humanName) {
        Write humanName.family_"  "_humanName.given
    }
        
    For i=0:1:r4Patient.name.list.size()-1 {
        Set humanName = r4Patient.name.list.%Get(i)
        Write humanName.family_"  "_humanName.given
    }
    Write r4Patient.name.list.apply("$[*].family").%ToJSON(),!
    Write r4Patient.name.list.apply("$[*].given").%ToJSON()
}

Hello @Corentin Blondeau

Here is the code to retrieve the properties in the same order they are defined in the class.


ClassMethod GetPropOnDefinedSequence(pClass As %String = "", Output pProperties)
{
	For {
		Set property=$$$comMemberNext(pClass,$$$cCLASSproperty,property)
		If property="" Quit
		If property="%%OID"!(property="%Concurrency") continue
		Set pProperties(
			    +$$$defMemberKeyGet(pClass,$$$cCLASSproperty,property,$$$cPROPsequencenumber),
			    property)=""
	}
	Return $$$OK
}

 The properties assigned to the pProperties parameter

properties(1,"Name")=""
properties(2,"City")=""
properties(3,"IsActive")=""
properties(4,"State")=""

Hello @Scott Roth 

The  HS.FHIRModel.R4.SeqOfHumanName has property "list" which is %DynamicArray. So, If you access via object r4Patient.name.list.%Get(0) for get 0 index value $ZCVT(r4Patient.name.list.toString(),"I","JSON") get entire value. Here r4Patient is a object of HS.FHIRModel.R4.Patient 

FHIRDEV>Write r4Patient.name.list.%Get(0)
{"use":"official","text":"Ashok,Kumar"}
FHIRDEV>Write $ZCVT(r4Patient.name.list.toString(),"I","JSON")
["{"use":"official","text":"Ashok,Kumar"}","{"text":"Ashok,Kumar"}"]
FHIRDEV>Write $ClassName(r4Patient)
HS.FHIRModel.R4.Patient

Hello @Evgeny Shvarov

Unfortunately, when the %JSONFIELDNAME parameter is not explicitly defined, the JSON adaptor treats the property name as a constant, making it fixed and case-sensitive.

However, you can define a custom mapping using an XData block to control how properties are mapped to JSON fields. This provides greater flexibility, and you can even use both %JSONFIELDNAME and XData mappings within the same class.

Example: Custom Mapping with XData

XData OnlyLowercaseTopLevel
{
  <Mapping xmlns="http://www.intersystems.com/jsonmapping">
    <Property Name="Name" FieldName="eventName"/>
    <Property Name="Location" Include="INPUTONLY"/>
  </Mapping>
}
  • Do obj.%JSONImport(dao) Default import (uses standard property names)
  • Do obj.%JSONImport(dao, "OnlyLowercaseTopLevel")Import using a custom mapping