Мне нужно заменить какой-либо шаблон текстовыми значениями и значениями json.
Моя проблема: первое значение замещения не подставляется.
У меня есть следующий код:
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.text.StringSubstitutor;
public class TestStringSubstitutor {
public static void main(String[] args) {
Map<String, String> parameters = new HashMap<>();
Map<String, String> jsonParameters = new HashMap<>();
parameters.put("entityId", "someid");
parameters.put("name", "someName");
parameters.put("now", ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT).toString());
jsonParameters.put("info", "{\"name\":\"John\",\"age\":30,\"car\":null}");
String template = "{\"description\":\"this is ja unit test\",\"time\":\"{now}\",\"name\":\"{name}\",\"entityId\":\"{entityId}\",\"info\":\"{{info}}\"}";
System.out.println(" template:" + template);
String modMessage = StringSubstitutor.replace(template, parameters, "{", "}");
System.out.println("replaced Message #1:" + modMessage);
modMessage = StringSubstitutor.replace(modMessage, jsonParameters, "\"{{", "}}\"");
System.out.println("replaced Message #2:" + modMessage);
}
}
Вывод:
template:{"description":"this is a unit test","time":"{now}","name":"{name}","entityId":"{entityId}","info":"{{info}}"}
replaced Message #1:{"description":"this is a unit test","time":"{now}","name":"someName","entityId":"someid","info":"{{info}}"}
replaced Message #2:{"description":"this is a unit test","time":"{now}","name":"someName","entityId":"someid","info":{"name":"John","age":30,"car":null}}
Задача {сейчас} должна быть заменена ...
Если я изменю порядок шаблона: name <-> time
String template = "{\"description\":\"this is a unit test\",\"name\":\"{name}\",\"time\":\"{now}\",\"entityId\":\"{entityId}\",\"info\":\"{{info}}\"}";
, тогда выводизменяется, {now} подставляется, но первое значение подстановки {name} по-прежнему не подставляется.
template:{"description":"this is a unit test","name":"{name}","time":"{now}","entityId":"{entityId}","info":"{{info}}"}
replaced Message #1:{"description":"this is a unit test","name":"{name}","time":"2019-10-01T08:35:10.961177100Z","entityId":"someid","info":"{{info}}"}
replaced Message #2:{"description":"this is a unit test","name":"{name}","time":"2019-10-01T08:35:10.961177100Z","entityId":"someid","info":{"name":"John","age":30,"car":null}}
Это ошибка или я что-то пропустил?