Nous avons un fichier ".properties" dont certaines valeurs ont été conservées en JSON. Je continue de se faire piquer par des caractères spéciaux, bien que - le org.json.JSONObject est pas très bavard sur ce qui l'amène à étouffer, donc il faut toujours de comprendre que je écrit{"key":"this is a \"Value\""}
, mais je lu{"key":"this is a "Value""}
. Évidemment, ce dernier va donner l'ajustement de l'analyseur JSON. Plutôt que de faire des essais par erreur, quelqu'un peut-il simplement me dire la bonne façon d'échapper à la valeur (qui dans ce cas est bien sûr toute la chaîne JSON ...) avant de passer à la classe PropertiesConfiguration pour être écrit dans un fichier?Quelle est la bonne façon d'échapper une chaîne avant de l'écrire dans une configuration de propriétés Apache Commons?
Répondre
Je pense que j'ai peut-être trouvé la déconnexion. Je pensais que nous avions quelque chose le long des lignes de
PropertiesConfiguration pc = new PropertiesConfiguration();
pc.addProperty("SomeKey",
new JSONObject().put("Stuff", getUserInput()).toString());
pc.save(myWriter);
Maintenant, imaginez que l'utilisateur fournit la chaîne This is "Interesting"...
. Mon problème vient du fait que pendant que la chaîne sera stockée avec les guillemets correctement saisies, le fichier de propriétés se terminera par
SomeKey={\"SomeKey\":\"This is \"Interesting\"\"}
qui est évidemment horriblement brisée. Voici pourquoi ça se passait (je pense). Au lieu d'utiliser la classe PropertiesConfiguration pour créer le fichier de propriétés comme dans le code idéal ci-dessus, le code d'origine était plus comme
myWriter.write(keyName + "=" +
new JSONObject().put("Stuff", getUserInput()).toString());
qui bien sûr échappe que l'entrée d'utilisateur pour le JSON, mais n'a pas encore échapper à la JSON pour l'analyseur de propriétés. Je ne peux pas jurer à lui sans tests supplémentaires, mais il semble que la méthode pc.AddProperty()
va échapper à ses arguments (à nouveau) si besoin est.
Résultat final: c'est de ma faute si j'ai supposé que le gars qui a écrit le code sur lequel je travaillais utilisait les API qui lui étaient fournies, plutôt que de "se tromper" et d'essayer de créer directement le format requis.
Le backslash est ignoré dans les fichiers de propriétés. Vous devez utiliser le codage Unicode comme ceci,
"this is a \u005c"Value\u005c""
J'ai peu ou pas de contrôle sur la sortie de JSONObject.toString(), qui est ce qui génère la valeur qui va être écrite dans le fichier de propriétés en premier lieu. Je vais mettre à jour la question pour clarifier cela. – Coderer