You can determine whether the value is an object by using $IsObject(value) before processing it.
Alternatively, you can rely on the third argument of %GetNext(,,.type), which tells you the datatype of the value.

Example code

set iter = identifiers.%GetIterator()
while iter.%GetNext(.key, .value, .type) {
    if $IsObject(value) {
        set text = value.%Get("text")
    }
}
set iter = identifiers.%GetIterator()
while iter.%GetNext(.key, .value, .type) {
    if type = "object" {
        set text = value.%Get(key) ;for example value.%Get("text")
    }
    if type = "array" {
        set text = value.%Get(index)  ; for example: value.%Get(0)
    }
}

Hi @Marcelo Witt 

AutoParallel and Adaptive Mode are enabled by default in InterSystems IRIS SQL query optimizer. Because of this, IRIS will automatically determine when parallel query execution is beneficial. Therefore, you usually don’t need to manually specify %PARALLEL unless you want to force parallelism or override the optimizer’s decision.

  • When AdaptiveMode is enabled, automatic parallel processing is applied to all SELECT queries, hinting them with %PARALLEL. However, not all queries may use parallel processing as the SQL Optimizer may decide otherwise.
  • When we are trying to utilize this %PARALLEL feature, we must consider AutoParallelThreshold as well (default value is 3200) and there is no use with this parameter in case AutoParallel is disabled.

This is a really interesting idea, and I think it raises an important point: the InterSystems ecosystem has grown big enough that community tools are now essential, not just “nice extras.” Even though most of these tools are maintained by individuals, creating a foundation could potentially make their management more efficient by providing structure, funding, and shared resources to support maintainers and help ensure long-term sustainability.

Hi @Lucrezia Puntorieri 
Yes you can create a method and classmethod programmatically.

Set clsmethodObj = ##class(%Dictionary.MethodDefinition).%New()
Set clsmethodObj.Name="TestClsMethod"
Set clsmethodObj.ClassMethod=1
Do clsmethodObj.Implementation.WriteLine($C(9)_"Set ^test=""Test"" ")
Do clsmethodObj.Implementation.WriteLine($C(9)_"Quit ^test ")

Set methodObj = ##class(%Dictionary.MethodDefinition).%New()
Set methodObj.Name="TestMethod"
Set methodObj.ClassMethod=0
Do methodObj.Implementation.WriteLine($C(9)_"For I=1:1:10 { S ^test(i)=i} ")
Do methodObj.Implementation.WriteLine($C(9)_"Quit ^test ")

Do clsObj.Methods.Insert(clsmethodObj)
Do clsObj.Methods.Insert(methodObj)

Hi Jack

IRIS does not provide built-in functionality to generate classes directly from a JSON Schema, unlike the support available for XML Schema (XSD). However, you can programmatically create and compile classes at runtime using the %Dictionary.ClassDefinition API.

Here is the sample code to generate a class.

ClassMethod CreateClass()
{	
	Set clsObj = ##class(%Dictionary.ClassDefinition).%New()
	Set clsObj.Name="Test.NewClass"
	Set clsObj.Super="%RegisteredObject,%JSON.Adaptor"
	Set clsObj.Description="Class created via code"
	Set clsObj.DdlAllowed = 1
	Set clsObj.Inheritance="left"
	
	Set propObj = ##class(%Dictionary.PropertyDefinition).%New()
	Set propObj.Name="Name"
	Set propObj.Type="%String"
	Set propObj.SqlColumnNumber=2
	Do propObj.Parameters.SetAt(70,"MAXLEN")
	
	Set indexObj = ##class(%Dictionary.IndexDefinition).%New()
	Set indexObj.Name="NameIdx"
	Set indexObj.Properties="Name"
	Do clsObj.Properties.Insert(propObj)
	Do clsObj.Indices.Insert( indexObj)
	Set st=  clsObj.%Save()
	D $SYSTEM.OBJ.Compile("Test.NewClass","ckb")
	If $$$ISERR(st) w $SYSTEM.OBJ.DisplayError(st)
}

Instead of using obj.%Get("property"), you can use %IsDefined("key"), which returns 1 if the key exists.

You can also use %Get("key",, "type"), where the optional type parameter specifies the expected return type. This helps prevent <MAXSTRING> errors when handling values near IRIS's maximum string length.

To enable native JSON support in a persistent class, extend %JSON.Adaptor. This provides built-in methods such as:

  • %JSONImport() — Imports a JSON or DAO directly into the object.
  • %JSONExport()— Export and display the value in the device
  • %JSONExportToString()— Export the value as a string.
  • %JSONExportToStream() — Export the value as a stream
Class Company.Employee Extends (%Persistent,%JSON.Adaptor) {
    Property Name As %String(MAXLEN=50);
    Property Age As %Integer;
    Property Department As %String(MAXLEN=50);

ClassMethod LoadData() As %Staus
{
    Set json = {"Name":"Test", "Age": 20, "Department": "IT"}
    Set obj = ..%New()
    Set sc = obj.%JSONImport(json)
    Set sc = obj.%Save()
    Return sc
}

ClassMethod ExportDataAsJSONString(Id) As %String
{
    Set obj = ..%OpenId(Id)
    Do obj.%JSONExportToString(.string)
    Return string
}

ClassMethod ExportDataAsJSONStream(Id) As %Steam.Object
{
    Set obj = ..%OpenId(Id)
    Do obj.%JSONExportToStream(.stream)
    Return stream
}
}

    If you're working with classes, it's recommended to use object-based or SQL-based data manipulation rather than directly using globals.

    Hi @Rutvik ISM 

    The FHIR binary resource data is exceeding the maximum length allowed by InterSystems IRIS. To store documents such as PDFs and other large data, you should use streams.

    • Use %Stream.GlobalBinary or %Stream.GlobalCharacter to store the data within the database.
    • Use %Stream.FileBinary or %Stream.FileCharacter to store the files on the file system.

    `Hi Rutvik

    You can handle this error with below code. Some sample code

    swt datatype "stream"
    While iter.%GetNext(.key, .value, .datatype) {
    }

    If you want to get the values as a stream from DynamicObject Use %Get(key,,"stream") 

    set stream = dao.%Get(key,,"stream")

    This 3rd parameter support in %GetNext() and %Get()  from 2022 version

    There is a specific reason for using this custom code instead of relying on the built-in %FromJSON() method. The third argument is currently not implemented in the following ##class(HS.FHIR.DTL.vR4.Model.Resource.Binary).%FromJSON(fhirresourceStream)

    ClassMethod SetBinaryR4(json As %DynamicObject) {
       Set obj = ##class(HS.FHIR.DTL.vR4.Model.Resource.Binary).%New()
       Set obj.contentType = json.contentType
       // Convert large data field to stream
       Set dataAsStrm = json.%Get("data",,"stream")
       Set obj.data = dataAsStrm
       Set obj.id = json.id
    }
    

    Thank you!