Note that instead of:

do ##class(isc.py.util.Shell).Shell()

Python Shell can be entered by simply typing

zpy

In there you can just directly type python code:

exec(open('disk:/path/to/your/folder/testfile.py').read())

Or don't open the shell and call:

set sc=##class(isc.py.Main).SimpleString("exec(open('disk:/path/to/your/folder/testfile.py').read())",,,.sc)

1. Underscored properties are extracted. Get them by quoting property name (case is important too):

set centro.codCias = objeto.GetAt(i)."cod_cias"

2. You don't need to init json provider as you're calling a classmethod, replace:

set claseAux = ##class(%ZEN.Auxiliary.jsonProvider).%New()
set tSC= claseAux.%ConvertJSONToObject(.linea,"EsquemasDatos.miSCS.GestionFavoritos.tns.infoCentro",.objeto,1)

with:

set tSC= ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(.linea,"EsquemasDatos.miSCS.GestionFavoritos.tns.infoCentro",.objeto,1)

or even better:


set class = ##class(EsquemasDatos.miSCS.GestionFavoritos.tns.infoCentro).%ClassName(1)
set tSC= ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(.linea,class,.objeto,1)

3. Iterators for JSON. Recommended approach is upgrading to 2016.2+ as  it contains way better json handling (dynamic objects) with iterators.

For %ZEN.proxy object you can call %CopyToArray and iterate over it.

set tSC = ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject("{""prop_a"":1,""prop_b"":2}",,.obj)
do obj.%CopyToArray(.array)
for {
    set key=$order(array(key),1,val)
    quit:key=""
    write key," = ",val,!
}

4. Iterators for classes. Use a method generator to write the code iterating over properties. Relevant discussion.

Call this sqlproc passing class and prop names:

ClassMethod Params(class, prop) As %String [SQLProc]
{
    set result = ""
    set param = ""
    for {
        set param = $$$defparamMemberNext(class,$$$cCLASSproperty,prop,$$$cPROPparameter,param)
        quit:(param ="")
        set value = $$$defMemberArrayGet(class,$$$cCLASSproperty,prop,$$$cPROPparameter,param)
        set result = result _ param _ "=" _ value _ ","
    }
    quit result
}

You need two task objects one of %SYS.Task class and another of your concrete implementation class. Call AssignSettings
 to merge settings. Example:

Set tTaskDefClass = "User.Task.MessageArchive"

Set tTaskObj = ##class(%SYS.Task).%New()
Set tTaskObj.NameSpace = "<NameSpace>"
Set tTaskObj.Name = "<tTaskName>"
Set tTaskObj.TaskClass = tTaskDefClass
Set tTaskObj.Description = "<tTaskDesc>"

Set tTaskDefObj = $System.OBJ.New(tTaskDefClass)
Set tTaskDefObj.BaseDir = "your value"
Set tStatus = tTaskObj.AssignSettings(tTaskDefObj)
Quit:$$$ISERR(tStatus) tStatus
Kill tTaskDefObj

Set tStatus = tTaskObj.%Save()