Syntaxe de OB GET

Bonjour,

J’ai un petit problème à vous soumettre.
Je récupère des données en format JSON à partir d’une API. Je reçois des objets dont j’extrais les données qui m’intéressent avec la commande OB GET.
Par exemple : $name=OB Get($TabContest{$i}.participant[$n];"@name")
Tout va très bien quand le nombre d’éléments “participants” est supérieur à 1.
Mais quand il est égal à un, la syntaxe employée par l’API n’est pas comme on pourrait le croire $TabContest{$i}.participant[0] mais $TabContest{$i}.participant.
Autrement dit, en l’absence de confusion possible entre les participants (puisqu’il n’y en a qu’un), on laisse tomber le $n entre crochets.
J’arrive à déterminer le nombre de participants mais je n’arrive pas à écrire une méthode simple qui me permette d’écrire tantôt participant[$n], tantôt participant tout court. Je pourrais évidemment le faire manuellement mais j’ai des centaines de rubriques à renseigner.
Quelqu’un aurait-il une solution élégante ?
D’avance merci,

A.

Bonjour,

Il faut faire un test sur le type de la valeur de participant. https://doc.4d.com/4Dv18/4D/18/Value-type.301-4504874.fe.htmlValue type> permet de savoir si c’est un objet ou une collection et donc d’adapter la syntaxe de OB get.

Merci Vincent, mais ce n’est pas exactement ce que je cherche.
J’ai un autre moyen de déterminer le nombre d’éléments de la collection. Je cherche surtout une solution (peut-être à base de pointeurs) pour manipuler tantôt $TabContest{$i}.participant[$n], tantôt $TabContest{$i}.participant.
Je ne sais pas si je me fais bien comprendre.
Merci de votre aide dans tous les cas.

Bonjour Antoine,
j’ai peut-être eu un cas similaire, quand je rencontrais un “truc” qui n’est pas une collection, je le transformais en collection, comme ça la suite du code marchait à l’identique. Dans ce genre :
<code 4D>
C_COLLECTION($test_c)
$test_c:=New collection()
$test_c.push(New object(“participant”;New collection(“a”;“b”;“c”)))
$test_c.push(New object(“participant”;“d”))
For each ($ref;$test_c)
If (Value type($ref.participant)#Is collection)
$ref.participant:=New collection($ref.participant)
End if
//…
End for each
</code 4D>

Sauf erreur dans la compréhension de votre demande il me semble que c’est pourtant la réponse :

<code 4D>

If (Value type($TabContest{$i}.participant)=Is collection)

		$name=OB Get($TabContest{$i}.participant[$n];"name")
		
	Else 
		
		$name=OB Get($TabContest{$i}.participant;"name")
		
	End if 

</code 4D>

une petite méthode “getValue” à utiliser à chaque fois que besoin :

<code 4D>
C_OBJECT($1)
C_TEXT($2)
C_LONGINT($3)
C_VARIANT($0)

	If (Value type($1)=Is collection)
		
		$0=OB Get($1[$3];$2)
		
	Else 
		
		$0=OB Get($1;$2)
		
	End if 

</code 4D>

vous permettrait d’écrire :

<code 4D>
$name= getValue($TabContest{$i}.participant;“name”;$n)
</code 4D>

Merci Vincent, c’est exactement ce qu’il me fallait !