我必须用文本和 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}}
<小时/>
问题 {now} 应该被替换...
如果我更改模板的顺序:名称 <--> 时间
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}}
这是一个错误还是我错过了什么?
最佳答案
来自joakim-danielson的提示解决了问题。前缀“{”和后缀“}”不是唯一的。
现在使用“{{”和“}}”。
这是一个工作示例:
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 = "{\"name\":\"{{name}}\",\"time\":\"{{now}}\",\"entityId\":\"{{entityId}}\",\"info\":\"{{info}}\", \"description\":\"this is a unit test\"}";
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:{"name":"{{name}}","time":"{{now}}","entityId":"{{entityId}}","info":"{{info}}", "description":"this is a unit test"}
replaced Message #1:{"name":"someName","time":"2019-10-01T10:56:54.991583700Z","entityId":"someid","info":"{{info}}", "description":"this is a unit test"}
replaced Message #2:{"name":"someName","time":"2019-10-01T10:56:54.991583700Z","entityId":"someid","info":{"name":"John","age":30,"car":null}, "description":"this is a unit test"}
关于java - 字符串替换对于第一次出现不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58181111/