@@ -31,7 +31,17 @@ public enum Chemins {
3131 var racine = try jsonObjet ( objet)
3232 racine = try remplacer ( racine, m [ ... ] , valeur, chemin: chemin)
3333 let data = try JSONSerialization . data ( withJSONObject: racine)
34- do { objet = try JSONDecoder ( ) . decode ( T . self, from: data) } catch { throw Erreur . valeurInvalide ( chemin, valeur) }
34+ guard let nouveau = try ? JSONDecoder ( ) . decode ( T . self, from: data) else { throw Erreur . valeurInvalide ( chemin, valeur) }
35+ // Le décodage tolérant remplace une valeur illisible par la valeur par défaut, sans erreur :
36+ // on relit pour vérifier que le changement a bien été pris (sinon c'est un refus, pas un succès silencieux).
37+ // (Un objet entier est complété par ses valeurs par défaut : on ne vérifie que les valeurs simples.)
38+ let v = Self . valeur ( racine, m)
39+ if !( v is [ String : Any ] ) && !( v is [ Any ] ) {
40+ let voulu = v. map ( texte) ?? " null "
41+ let obtenu = lire ( chemin, dans: nouveau) ?? " null "
42+ guard voulu == obtenu || ( Double ( voulu) != nil && Double ( voulu) == Double ( obtenu) ) else { throw Erreur . valeurInvalide ( chemin, valeur) }
43+ }
44+ objet = nouveau
3545 }
3646
3747 /// Le modèle sous forme JSON (pour le montrer à l'IA).
@@ -111,7 +121,8 @@ public enum Chemins {
111121 default :
112122 // Valeur absente ou nulle : on devine (nul, booléen, nombre, JSON, sinon texte).
113123 if bas == " null " || bas == " nil " || t. isEmpty { return NSNull ( ) }
114- if bas == " true " || bas == " false " { return bas == " true " }
124+ if [ " true " , " oui " , " yes " , " vrai " ] . contains ( bas) { return true }
125+ if [ " false " , " non " , " no " , " faux " ] . contains ( bas) { return false }
115126 if let nombre { return nombre }
116127 if t. hasPrefix ( " { " ) || t. hasPrefix ( " [ " ) , let d = t. data ( using: . utf8) , let o = try ? JSONSerialization . jsonObject ( with: d) { return o }
117128 return t
0 commit comments