PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → json chaine rtf
json chaine rtf
Débuté par Laurent HERMANN, 12 fév. 2026 09:58 - 6 réponses
Membre enregistré
365 messages
Posté le 12 février 2026 - 09:58
bonjour,

je reçois d'un champs rtf la variable icfr que je mets en forme json :

sJSON est une chaîne = [
{
"q":96,
"i":"%1",
"icfr":"%2"
}
]


sJSON = ChaîneConstruit(sJSON, gnIDProjet, sICFR)
sJSON = Remplace(sJSON,RC,"")
Trace(sJSON)
soit vJson = JSONVersVariant(sJSON)


{"q":96,"i":"10622","icfr":"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}}{\*\generator Riched20 10.0.26100}\viewkind4\uc1 \pard\f0\fs23 lolo\par}"}

pour ensuite faire un appel à une API

le variant ne veut pas se faire
je n'arrive pas à échapper les accolades...

une diée

merci

--
LH
Membre enregistré
303 messages
Posté le 12 février 2026 - 10:53
Bonjour,
Essayes de passer directement par un type JSON

jJSON est un JSON
jJSON.q = 96
jJSON.i = gnIDProjet
jJSON.icfr = sICFR // ou "{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}}{\*\generator Riched20 10.0.26100}\viewkind4\uc1 \pard\f0\fs23 lolo\par}"
Trace(jJSON)
soit vJson = JSONVersVariant(jJSON)
Message modifié, 12 février 2026 - 11:04
Membre enregistré
1 172 messages
Posté le 12 février 2026 - 14:11
Bonjour Laurent,

Cela ne peux pas pas fonctionner car en JSON les \ ouvrent une séquence d'échappement. Du coup \ansi et vu comme \a qui ne correspond à rien.

Il ne faut pas échapper les accolades.

Une solution serait de doubler les \.

Conseille : oublie le "soit vJson...."
Contrôle le type d'emblée : vJson est un Variant...


Voici un code qui fonction (version 2026)
sJSON est une chaîne = [
{
"q":96,
"i":"%1",
"icfr":"%2"
}
]

sICFR est une chaîne=`
{\rtf1\ANSI\ansicpg1252\deff0\nouicompat\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}}{\*\generator Riched20 10.0.26100}\viewkind4\uc1 \pard\f0\fs23 lolo\par}
`
sICFR = Remplace(sICFR,"\","\\")
sJSON = ChaîneConstruit(sJSON, 2, sICFR)

// Test avant parse (si dispo dans ta version)
SI JSONValide(sJSON) ALORS
vJson est un Variant = JSONVersVariant(sJSON)
SINON
Erreur("JSON invalide")
FIN



PS : Jeudi prochain je fais une masterclass sur le format JSON

--
Thierry TILLIER
Développeur WINDEV -WEBDEV
Formation WINDEV :
https://www.cours-windev-thierrytillier.com/
Tuto WINDEV sur ma chaîne YouTube
Membre enregistré
1 172 messages
Posté le 12 février 2026 - 14:13
Et attention aux guillemets en trop.

--
Thierry TILLIER
Développeur WINDEV -WEBDEV
Formation WINDEV :
https://www.cours-windev-thierrytillier.com/
Tuto WINDEV sur ma chaîne YouTube
Membre enregistré
303 messages
Posté le 12 février 2026 - 14:23
THIERRY TILLIER a écrit :
Bonjour Laurent,

Cela ne peux pas pas fonctionner car en JSON les \ ouvrent une séquence d'échappement. Du coup \ansi et vu comme \a qui ne correspond à rien.

Il ne faut pas échapper les accolades.

Une solution serait de doubler les \.

Conseille : oublie le "soit vJson...."
Contrôle le type d'emblée : vJson est un Variant...


Voici un code qui fonction (version 2026)
sJSON est une chaîne = [
{
"q":96,
"i":"%1",
"icfr":"%2"
}
]

sICFR est une chaîne=`
{\rtf1\ANSI\ansicpg1252\deff0\nouicompat\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}}{\*\generator Riched20 10.0.26100}\viewkind4\uc1 \pard\f0\fs23 lolo\par}
`
sICFR = Remplace(sICFR,"\","\\")
sJSON = ChaîneConstruit(sJSON, 2, sICFR)

// Test avant parse (si dispo dans ta version)
SI JSONValide(sJSON) ALORS
vJson est un Variant = JSONVersVariant(sJSON)
SINON
Erreur("JSON invalide")
FIN



PS : Jeudi prochain je fais une masterclass sur le format JSON

--
Thierry TILLIER
Développeur WINDEV -WEBDEV
Formation WINDEV :
https://www.cours-windev-thierrytillier.com/
Tuto WINDEV sur ma chaîne YouTube


Désolé de te contredire Thierry mais ça fonctionne parfaitement avec un type JSON en WD2025 :
Il est inutile de doubler les \ avec Remplace (le type JSON le gère automatiquement)

J'ai testé avec un champs RTF (comme l'a indiqué Laurent) :
SAI_RTF1 = "{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}}{\*\generator Riched20 10.0.26100}\viewkind4\uc1 \pard\f0\fs23 lolo\par}"

jJSON est un JSON
jJSON.q = 96
jJSON.i = 10622
jJSON.icfr = SAI_RTF1


Trace("JSON = "+jJSON.VersChaîne())

Trace("")
Trace("jJSON.icfr = "+jJSON.icfr)

soit vJson = JSONVersVariant(jJSON)
Trace("")
Trace("vJson.icfr = "+vJson.icfr)



Et voici ce que l'on obtient, le résultat est correct :

JSON = { "q":96, "i":10622, "icfr":"{\\rtf1\\ansi\\ansicpg1252\\deff0\\nouicompat\\deflang1036{\\fonttbl{\\f0\\fswiss\\fprq2\\fcharset0 Calibri;}}\r\n{\\*\\generator Riched20 10.0.26100}\\viewkind4\\uc1 \r\n\\pard\\f0\\fs23 lolo\\par\r\n}\r\n" }

jJSON.icfr = {\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}}
{\*\generator Riched20 10.0.26100}\viewkind4\uc1
\pard\f0\fs23 lolo\par
}


vJson.icfr = {\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}}
{\*\generator Riched20 10.0.26100}\viewkind4\uc1
\pard\f0\fs23 lolo\par
}

Cdlt
Message modifié, 12 février 2026 - 14:30
Membre enregistré
1 172 messages
Posté le 12 février 2026 - 16:18
Fabrice

Si tu regarde bien ton code la commande ; jJSON.VersChaîne() réalise le double échappement \\.
Et comme Laurent veut utiliser ce JSON pour un API tu devras faire :
MonhttpRequete est un httpRequete
....
MonhttpRequete .Contenu= jJSON.VersChaîne()

à vérifier avec une API.


C'est plus simple, en effet avec un type JSON.
Je suis resté sur le code d'origine.

--
Thierry TILLIER
Développeur WINDEV -WEBDEV
Formation WINDEV :
https://www.cours-windev-thierrytillier.com/
Tuto WINDEV sur ma chaîne YouTube
Message modifié, 12 février 2026 - 16:41
Membre enregistré
303 messages
Posté le 12 février 2026 - 17:15
Thierry,

Laurent souhaitait juste que la fonction JSONVersVariant() puisse s'exécuter "sans provoquer une exception" car je présume qu'il a besoin d'utiliser un variant dans l'API.

le variant ne veut pas se faire
je n'arrive pas à échapper les accolades...


C'est la raison pour laquelle j'ai proposé le type JSON (et non une chaine) pour la fonction JSONVersVariant()

A lui de choisir la méthode qui lui conviendra le mieux.

Bon dév..