Salut,
Remplacer du texte par du texte risque de poser différents soucis en fonction du json à traiter. En plus, je suppose qu'il s'agit de remplacer la valeur d'une propriété du json et non de remplacer le nom d'une propriété.
Le plus simple serait de passer par un parser (Jackson, Gson, json.simple...) et de maintenir l'objet en mémoire pour le modifier à chaque envoi.
A la limite, on peut même se passer de parser, en utilisant nashorn :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public class Demo {
public static void main(String[] args) {
String json = load();
System.out.println("JSON chargé : "+json);
json = setVariable(json, "var1","'yyy'");
System.out.println("JSON var1 modifiée : "+json);
json = setVariable(json, "var2","100");
System.out.println("JSON var2 modifiée : "+json);
}
private static String setVariable(String json, String var, String value) {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
StringBuilder sb = new StringBuilder("function modify() {");
sb.append("data=").append(json).append(";");
sb.append("data.").append(var).append("=").append(value).append(";");
sb.append("return JSON.stringify(data,null,4);}");
try {
engine.eval(sb.toString());
return String.valueOf(((Invocable)engine).invokeFunction("modify", json, var, value));
} catch (NoSuchMethodException | ScriptException e) {
throw new RuntimeException(e);
}
}
private static String load() {
try {
return Files.lines(Paths.get("json.txt")).collect(Collectors.joining("\n"));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
} |
Résultat
JSON chargé : {
"var1":"xxx",
"var2":42
}
JSON var1 modifiée : {
"var1": "yyy",
"var2": 42
}
JSON var2 modifiée : {
"var1": "yyy",
"var2": 100
}
Et s'il s'agit de patcher un json, utiliser une expression régulière, ou String.format().
Partager