Question
· Mai 15

Modification d'un objet dynamique provenant d'un JSON

Bonjour, 

Je souhaite réaliser une méthode générique pour modifier des propriétés d'une classe dynamique. Lorsque je fais un JSONImport() cela fonctionne très bien pour certains objet, or dans le cas d'un objet contenant une liste cela m'ajoute un élément en plus au lieu de la modifier. J'ai essayée de vérifier le type lors de l'itération du JSON afin de faire un Insert mais je n'arrive pas à utiliser les $METHOD sur le Insert ou même le %Set. 

Voici la classe : 

Class Epc.conf.poste Extends (%Persistent, %JSON.Adaptor)
{

Property NomPoste As %String(%JSONFIELDNAME = "NomPoste", MAXLEN = "");

Property tPrinter As list Of EpErp.conf.printer(%JSONFIELDNAME = "tPrinter", SQLPROJECTION = "table/column", STORAGEDEFAULT = "array");
}
Class EpErp.conf.printer Extends (%SerialObject, %JSON.Adaptor)
{

Property Service As %String(%JSONFIELDNAME = "NomService", MAXLEN = "");

Property Print As %String(%JSONFIELDNAME = "NomImprimante", MAXLEN = "");
}

Mes données actuelles : 

Le fichier que j'envoie afin de modifier ma liste, je souhaite donc modifier un des éléments de ma list  : 

{
	"NomPoste":"Poste",
	"tPrinter":
	[
		{
			"NomService":"Petite",
			"NomImprimante":"EPFR_12"
		},
		{
			"NomService":"Grande",
			"NomImprimante":"Modif"
		}
	]
}

Ma méthode de modification générique : 

ClassMethod update(){
    
set payload={}.%FromJSON(%request.Content)

 set itr           = payload.%GetIterator()  

 if ##class(%Dictionary.ClassDefinition).%ExistsId(className){
  set class = $CLASSMETHOD(className,"%OpenId",id)
   if $ISOBJECT(class){
       if payload '= ""{
          while itr.%GetNext(.prop,.val) {
              if prop.%IsA("%DynamicArray"){
                    ?                 
                }else{
                    Set $PROPERTY(class, prop) = val
                }
               
                  do class.%Save()
                 }
             }
        }
     }
}

Merci par avance pour votre aide. 

Discussion (1)2
Connectez-vous ou inscrivez-vous pour continuer

Bonsoir Julia,

Si vous renvoyez toujours le json avec la liste tPrinter complète, le plus simple serait de faire un clear de la liste et la recharger, ex : 

 

ClassMethod TestUpdate() As %Status
{
	Set tSC = $$$OK
	
	Set json = {
		"NomPoste":"Poste",
		"tPrinter":
		[
			{
				"NomService":"Petite",
				"NomImprimante":"EPFR_12"
			},
			{
				"NomService":"Grande",
				"NomImprimante":"modif"
			}
		]
	}
	
	Set id = 1 
	
	Set tSC = ..UpdatePoste(id, json)
		
	Return tSC
}



ClassMethod UpdatePoste(id As %Integer, json As %DynamicObject) As %Status
{
	Set poste = ##class(Epc.conf.poste).%OpenId(id, , .tSC)
	
	If $$$ISERR(tSC) Return tSC
	
	Do poste.tPrinter.Clear() ; supprime le contenu actuel de la liste tPrinter
	
	Do poste.%JSONImport(json)
	
	Set tSC = poste.%Save()
		
	Return tSC
}

Est-ce que cela peut vous aider ?